nodejs加密模块crypto

来源:互联网 发布:java 服务器监控 开源 编辑:程序博客网 时间:2024/05/20 18:56
nodejs加密模块crypto


前言:nodejs加密模块,对数据进行加密。做了一个关于钱的项目就各种加密,研究了一下还是遇到不少坑,所以记录下来以免重复踩坑。


crypto的官网API地址:https://nodejs.org/api/crypto.html,API记录很全,这里记录一些坑。


一 .记录几个比较常用的加密方法
1 crypto.getHashes(),Returns an array with the names of the supported elliptic curves.
2 crypto.getCiphers(); Returns an array with the names of the supported ciphers.
3 crypto.createHash(algorithm).update(value, incode).digest(outcode);
hash算法,algorithm:方法1里得到的一些算法,value:待加密的值,incode:输入编码,outcode:输出编码
4 crypto.createHmac(algorithm, key).update(value,incode).digest('hex')
HMAC算法,algorithm:方法1里得到的一些算法,key:加密的密钥,value:待加密的值,incode:输入编码,outcode:输出编码
5 var ll = crypto.createCipher(algorithm, key)
ll.setAutoPadding(true)
ll.update(value, incode,outcode)
pd = ll.final(outcode);
公开密钥加密:algorithm:方法2里得到的一些算法,key:加密的密钥value:待加密的值,incode:输入编码,outcode:输出编码


二.示例


1.非对称加密:用公钥进行加密(客户端公钥加密,后台私钥解密)
2.对称加密  :双方使用同一密钥进行加密解密(对密码一类敏感数据进行加密)


非对称加密:
1.公钥var public_key = '-----BEGIN PUBLIC KEY-----\n' +
    'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDG7ddw3jARDZ6dX//og7sQXiTS\n' +
    'ljCFSqCxh14dz5J2byacgkNJY63spPB7NrDZetvqMTMz1q5ebl//cvmtTV3rtrZ2\n' +
    'Ds3OlGSRCb52p+zV+i+5vW56mZAXlgShRLzkQ9D3cxO7Crss+DiCPxe76RVlFzWP\n' +
    '48fNhbxG/MaZB4f9nwIDAQAB\n' +
    '-----END PUBLIC KEY-----';
公钥的开头结尾一定要加上'-----BEGIN PUBLIC KEY-----\n' 、 '-----END PUBLIC KEY-----',不然会报错。
然后用公钥对密钥进行加密,这里使用ursa模块,因为没找到crypto里关于公钥加密的例子,⊙﹏⊙b汗,哪位大神如果知道欢迎指教。
下面是代码片段
var ursa = require('ursa');
var encoding = require('encoding');
var clientModulusBit = 512;
var clientMaxBit = clientModulusBit / 8;
var serverMaxBit = serverModulusBit / 8;
var serverRealBit = serverMaxBit - 11;
var clientRealBit = clientMaxBit - 11;
var padding = ursa.RSA_PKCS1_PADDING;
var pub = ursa.createPublicKey(public_key);
var dd = getUuid(); //随机数(动态密钥),用来加密敏感数据的。
var d_key = encrypt(dd, pub, clientRealBit, padding) //公钥加密后的动态秘钥,传到后台。
//加密方法
function encrypt(plain, publicKey, realBit, padding) {
var start1 = 0;
var end1 = realBit;
var result1 = '';
var originBuff = new Buffer(plain);
var originByte = bytes(plain, 'utf8');
while (start1 < originByte) {
var originTmp = originBuff.slice(start1, end1);
result1 += publicKey.encrypt(originTmp, 'binary', 'binary', padding);
start1 += realBit;
end1 += realBit;
}
var encrypted = encoding.convert(result1, 'binary', 'base64');
return encrypted.toString();
}


2对称加密:直接上代码
var pub = req.body.dd;//动态密钥
var pd;
//DES_EDE3的加密key只能是24位,只能是24位,只能是24位,重要的事情要说三遍!
var ll = crypto.createCipheriv('des-ede3', pub.substr(0, 24), new Buffer(0))
ll.setAutoPadding(true)
ll.update(new Buffer(req.body.password), 'utf8', 'base64')
pd = ll.final('base64');</span>


0 0
原创粉丝点击