zoukankan      html  css  js  c++  java
  • nodejs --- crypto实现加密(转)

    crypto实现加密

      本文转自:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501504929883d11d84a1541c6907eefd792c0da51000

      crypto模块的作用是为了实现通用的加密和哈希算法。用纯JavaScript实现加密也是可以的,但是比较麻烦且速度很慢, 但是node就使用底层的C/C++实现了加密和哈希算法然后封装起来暴露出接口,供js调用 。 crypto可以实现MD5和SHA1等等等等,因为crypto是封装了很多种加密算法的模块。

      MD5和SHA1

      MD5是一种常用的哈希算法,用于给任意数据一个签名,这个签名用一个16进制字符串表示 。

    const crypto = require('crypto');
    
    const hash = crypto.createHash('md5');
    
    // 可任意多次调用update():
    hash.update('Hello, world!');
    hash.update('Hello, nodejs!');
    
    console.log(hash.digest('hex')); // 7e1977739c748beac0c0fd14fd26a544

      update()方法默认字符串编码为UTF-8,也可以传入Buffer。

      如果要计算SHA1来进行签名,只需要将MD5改为SHA1即可。

      还有更安全的SHA256和SHA512。 (注意: SHA1最后是数字1,而不是字母L)。

      Hmac

      Hmac也是一种哈希算法,不同的是,这种算法除了MD5和SHA1的相似之处外,还需要一个额外的密钥。

    const crypto = require('crypto');
    
    const hmac = crypto.createHmac('sha256', 'secret-key');
    
    hmac.update('Hello, world!');
    hmac.update('Hello, nodejs!');
    
    console.log(hmac.digest('hex')); // 80f7e22570...

      只要密钥发生了变化,那么同样的输入数据也会得到不同的签名,因此,可以把Hmac理解为用随机数“增强”的哈希算法。

      AES

      AES是一种常用的对称加密算法,加解密都用同一个密钥。crypto模块提供了AES支持,但是需要自己封装好函数,便于使用:

    const crypto = require('crypto');
    
    function aesEncrypt(data, key) {
        const cipher = crypto.createCipher('aes192', key);
        var crypted = cipher.update(data, 'utf8', 'hex');
        crypted += cipher.final('hex');
        return crypted;
    }
    
    function aesDecrypt(encrypted, key) {
        const decipher = crypto.createDecipher('aes192', key);
        var decrypted = decipher.update(encrypted, 'hex', 'utf8');
        decrypted += decipher.final('utf8');
        return decrypted;
    }
    
    var data = 'Hello, this is a secret message!';
    var key = 'Password!';
    var encrypted = aesEncrypt(data, key);
    var decrypted = aesDecrypt(encrypted, key);
    
    console.log('Plain text: ' + data);
    console.log('Encrypted text: ' + encrypted);
    console.log('Decrypted text: ' + decrypted);

      运行结果如下:

    Plain text: Hello, this is a secret message!
    Encrypted text: 8a944d97bdabc157a5b7a40cb180e7...
    Decrypted text: Hello, this is a secret message!

      可以看出加密后的字符经过解密由得到了原来的内容。

    注意到AES有很多不同的算法,如aes192aes-128-ecbaes-256-cbc等,AES除了密钥外还可以指定IV(Initial Vector),不同的系统只要IV不同,用相同的密钥加密相同的数据得到的加密结果也是不同的。加密结果通常有两种表示方法:hex和base64,这些功能Nodejs全部都支持,但是在应用中要注意,如果加解密双方一方用Nodejs,另一方用Java、PHP等其它语言,需要仔细测试。如果无法正确解密,要确认双方是否遵循同样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式

      

      Diffie-Hellman

      。。。

  • 相关阅读:
    Metasploit advanced命令使用技巧
    Metasploit命令info使用技巧
    Kali Linux 2020.1b发布了
    设置USB无线网卡为监听模式大学霸IT达人
    解决ifconfig命令未找到
    Metasploit新增技巧提示功能
    Wireshark运算符!=无法正常工作
    解决Kali Linux XFCE桌面Tab无法补全
    Nessus更新到8.9.1
    ASP入门(七)-Response小案例
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/6759468.html
Copyright © 2011-2022 走看看