Node.js的crypto (加密)模块

crypto (加密)模块

crypto 模块提供了加密功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。javascript

能够经过 require('crypto') 来访问该模块。java

MD5和SHA1

MD5是一种经常使用的哈希算法,用于给任意数据一个“签名”。这个签名一般用一个十六进制的字符串表示:node

const crypto = require('crypto');
const md5hash = crypto.createHash('md5')
                .update('Hello, world!')
                .update('Hello, nodejs!')
                .digest('hex');
console.log(md5hash); //7e1977739c748beac0c0fd14fd26a544
复制代码

可任意屡次调用update(): update()方法默认字符串编码为UTF-8,也能够传入Buffer。 若是要计算SHA1,只须要把'md5'改为'sha1'。 还可使用更安全的sha256和sha512,即下面要说的Hmac。算法

Hmac

Hmac算法也是一种哈希算法,它能够利用MD5或SHA1等哈希算法。不一样的是,Hmac还须要一个密钥:安全

const crypto = require('crypto');
const secret = 'abcdefg';
const shahash = crypto.createHmac('sha256', secret)
                   .update('I love cupcakes')
                   .update('I love cupcakes 2')
                   .digest('hex');
console.log(shahash);   //a7a10c0eaaac7ce8f570a29dd5201548a440005efa69684f565c4f7c520f17d9
复制代码

只要密钥发生了变化,那么一样的输入数据也会获得不一样的签名,所以,能够把Hmac理解为用随机数“加强”的哈希算法。函数

AES

AES也是一种经常使用的对称加密算法,加解密都用同一个密钥。crypto模块提供了AES支持,可是须要本身封装好函数,便于使用:测试

const crypto = require('crypto');

function aesEncrypt(data, key) {
    const cipher = crypto.createCipher('aes192', key);
    let crypted = cipher.update(data, 'utf8', 'hex');
    crypted += cipher.final('hex');
    return crypted;
}

function aesDecrypt(encrypted, key) {
    const decipher = crypto.createDecipher('aes192', key);
    let decrypted = decipher.update(encrypted, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    return decrypted;
}

let data = '个人密码';
let key = 'Password!';
let encrypted = aesEncrypt(data, key);
let decrypted = aesDecrypt(encrypted, key);

console.log('text: ' + data);
console.log('Encrypted text: ' + encrypted);
console.log('Decrypted text: ' + decrypted);
// Plain text: 个人密码
// Encrypted text: 3cdfa3aafa581ce77eb816d2ea6f901f
// Decrypted text: 个人密码
复制代码

能够看出,这种加密方式是可逆的,即加密后的字符串经过解密又获得了原始内容。 AES有不少不一样的算法,如aes192,aes-128-ecb,aes-256-cbc等,AES除了密钥外还能够指定IV(Initial Vector),不一样的系统只要IV不一样,用相同的密钥加密相同的数据获得的加密结果也是不一样的。ui

加密结果一般有两种表示方法:hex和base64,这些功能Nodejs所有都支持,可是在应用中要注意,若是加解密双方一方用Nodejs,另外一方用Java、PHP等其它语言,须要仔细测试。编码

若是没法正确解密,要确认双方是否遵循一样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式。加密

Diffie-Hellman

DH算法是一种密钥交换协议,它可让双方在不泄漏密钥的状况下协商出一个密钥来。DH算法基于数学原理,好比A和B想要协商一个密钥,能够这么作:

使用场景:

A先选一个素数和一个底数:素数p=23,底数g=5(底数能够任选),再选择一个秘密整数a=6,计算A=g^a mod p=8,而后告诉B:p=23,g=5,A=8;

B收到A发来的p,g,A后,也选一个秘密整数b=15,而后计算B=g^b mod p=19,并告诉A:B=19;

A本身计算出s=B^a mod p=2,B也本身计算出s=A^b mod p=2,所以,最终协商的密钥s为2。 很麻烦的样子,仍是上代码吧:

const crypto = require('crypto');
// A 的 keys:
let A = crypto.createDiffieHellman(512);        
let A_keys = A.generateKeys();                 

let prime = A.getPrime();
let generator = A.getGenerator();

console.log('Prime: ' + prime.toString('hex'));
console.log('Generator: ' + generator.toString('hex'));

// B 的 keys:
let B = crypto.createDiffieHellman(prime, generator);
let B_keys = B.generateKeys();

// exchange and generate secret:
let A_secret = A.computeSecret(B_keys);
let B_secret = B.computeSecret(A_keys);

// print secret:
console.log('Secret of A: ' + A_secret.toString('hex'));
console.log('Secret of B: ' + B_secret.toString('hex'));
复制代码

That's all, 如上;

相关文章
相关标签/搜索