Nodejs crypto密码模块
crypto安装
$ npm install crypto
crypto使用
createHash
适用于md4,md5,sha1,sha2(sha224,sha384,sha256,sha512)等
let sha1 = crypto.createHash('sha1').update('AppBlog.CN');
let md5 = crypto.createHash('md5').update("AppBlog.CN");
let sha2 = crypto.createHash('sha256').update('AppBlog.CN');
console.log(sha1.digest('hex'))
console.log(md5.digest('hex'))
console.log(sha2.digest('hex'))
createHmac可以理解为用随机数“增强”的哈希算法,加salt
let Hmd5 = crypto.createHmac('md5', 'salt').update('AppBlog.CN');
console.log(Hmd5.digest('hex'))
AES对称加密
在AES的规格中,密钥长度只有128、192和256比特三种
128bit = 16字节
let data = '123456'
let password = 'baby'
const cipher = crypto.createCipher('aes192', password)
let encrypted = cipher.update(data, 'utf-8', 'hex')
encrypted += cipher.final('hex')
console.log(encrypted);
Nodejs声明crypto.createCipher()
废弃,建议使用crypto.createCipheriv()
代替
密码学分组模式推荐使用CBC(密文分组链接)和CTR(计数器)模式
分组模式默认为CBC,aes-128-cbc
或aes128
,初始化向量iv不可缺省
也可使用CTR模式,如:aes-128-ctr
加密结果通常有两种表示方法:hex和base64,这些功能Nodejs全部都支持,但是在应用中要注意,如果加解密双方一方用Nodejs,另一方用Java、PHP等其它语言,需要仔细测试。如果无法正确解密,要确认双方是否遵循同样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式。
加密
const key = Buffer.from('Hello, PrettyGirl', 'utf8');
let cipheriv = crypto.createCipheriv('aes-128-cbc', key, key);
let encrypted = cipheriv.update('I love you', 'utf8', 'hex');
encrypted += cipheriv.final('hex')
console.log(encrypted)
解密
const cipheriv = crypto.createDecipheriv('aes128', key, key);
let decrypted = cipheriv.update('63fc3b6fb3513831c3189d9eee92a1ed', 'hex', 'utf8');
decrypted += cipheriv.final('utf8')
console.log(decrypted)
AES 密码
// 加密
encrypt (plaintText) {
let options = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}
let key = CryptoJS.enc.Utf8.parse(keys)
let encryptedData = CryptoJS.AES.encrypt(JSON.stringify(plaintText), key, options)
//对象
// var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123');
let encryptedBase64Str = encryptedData.toString()
return encryptedBase64Str
},
// 解密
/*
* {param} plaintText 解密密文
* return str 解密结果
*/
decrypt (encryptedBase64Str) {
// eslint-disable-next-line no-redeclare
let options = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}
let key = CryptoJS.enc.Utf8.parse(keys)
// 解密
let decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, options)
// 解密后,需要按照Utf8的方式将明文转位字符串
// console.log(decryptedData)
let decryptedStr = JSON.parse(decryptedData.toString(CryptoJS.enc.Utf8))
return decryptedStr
}
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/23/nodejs-crypto-password-module/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论