1. crypto #

cryptonode.js中实现加密和解密的模块 在node.js中,使用OpenSSL类库作为内部实现加密解密的手段 OpenSSL是一个经过严格测试的可靠的加密与解密算法的实现工具

windows版openSSL下载 代码

2. 散列(哈希)算法 #

散列算法也叫哈希算法,用来把任意长度的输入变换成固定长度的输出,常见的有md5,sha1等

获取所有的散列算法

console.log(crypto.getHashes());

散列算法示例

var crypto = require('crypto');
var md5 = crypto.createHash('md5');//返回哈希算法
var md5Sum = md5.update('hello');//指定要摘要的原始内容,可以在摘要被输出之前使用多次update方法来添加摘要内容
var result = md5Sum.digest('hex');//摘要输出,在使用digest方法之后不能再向hash对象追加摘要内容。
console.log(result);

多次update

var fs = require('fs');
var shasum = crypto.createHash('sha1');//返回sha1哈希算法
var rs = fs.createReadStream('./readme.txt');
rs.on('data', function (data) {
    shasum.update(data);//指定要摘要的原始内容,可以在摘要被输出之前使用多次update方法来添加摘要内容
});
rs.on('end', function () {
    var result = shasum.digest('hex');//摘要输出,在使用digest方法之后不能再向hash对象追加摘要内容。
    console.log(result);
})

3. HMAC算法 #

HMAC算法将散列算法与一个密钥结合在一起,以阻止对签名完整性的破坏 生成私钥

$ openssl genrsa -out key.pem 1024
var crypto = require('crypto');
var shasum = crypto.createHmac('sha1', 'zfpx');
var result = shasum.update('hello').digest('hex');
console.log(result);

4. 加密解密 #

blowfish算法是一种对称的加密算法,对称的意思就是加密和解密使用的是同一个密钥。

var crypto = require('crypto');
var fs = require('fs');

function cipher() {
    var cipher = crypto.createCipher('blowfish',
    fs.readFileSync('key.pem', 'ascii'));//指定算法和密码
    cipher.update('123456', 'utf8', 'hex');//指定要加密的内容
    return cipher.final('hex');//输出加密后的结果
}
var result = cipher();
console.log(result);

var decipher = crypto.createDecipher('blowfish',
 fs.readFileSync('key.pem', 'ascii'));//指定算法和密码
decipher.update(result, 'hex', 'utf8');//指定要解密的内容
var result = decipher.final('utf8');//输出解密后的结果
console.log(result);

5. 非对称加密算法 #

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey) 公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密 因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法

为私钥创建公钥

$ openssl req -key key.pem -new -x509 -out cert.pem
var crypto = require('crypto');
var fs = require('fs');
var buffer = new Buffer('hello');
var secret = crypto.publicEncrypt(
  fs.readFileSync('cert.pem').toString(), buffer);//使用公钥对数据进行加密
var result = crypto.privateDecrypt(
  fs.readFileSync('key.pem').toString(), secret);//使用私钥对数据进行解密
console.log(result.toString());

6. 签名 #

在网络中,私钥的拥有者可以在一段数据被发送之前先对数据进行签名得到一个签名 通过网络把此数据发送给数据接收者之后,数据的接收者可以通过公钥来对该签名进行验证,以确保这段数据是私钥的拥有者所发出的原始数据,且在网络中的传输过程中未被修改。

var crypto = require('crypto');
var fs = require('fs');
function sign() {
    var sign = crypto.createSign('RSA-SHA256');
    sign.update('test');
    return sign.sign(fs.readFileSync('key.pem').toString('ascii'), 'hex');
}
var result = sign();
console.log(result);

function verify() {
    var public = fs.readFileSync('cert.pem').toString();
    var verify = crypto.createVerify('RSA-SHA256');
    verify.update('test');
    console.log(verify.verify(public, result, 'hex'));
}
verify();