- createHash
适用于md4,md5,sha1,sha2(sha224,sha384,sha256,sha512)等
let hash = crypto.createHash('sha1');
let hash1 = crypto.createHash('md5');
let sha2 = crypto.createHash('sha256').update('IloveYou');
// const argvElement = process.argv[1];
// console.log(argvElement)
hash.update('IloveYou');
hash1.update("IloveYou");
console.log(hash.digest('hex'))
console.log(hash1.digest('hex'))
console.log(sha2.digest('hex'))
createHmac
Hmac可以理解为用随机数“增强”的哈希算法,加salt
let Hmd5 = crypto.createHmac('md5','hello').update('IloveYou');
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');
console.log(a===b)
let cipheriv = crypto.createCipheriv('aes-128-cbc',key,key);
let Cupdate = cipheriv.update('I love you','utf8','hex');
Cupdate+=cipheriv.final('hex')
console.log(Cupdate)
解密
const cipheriv = crypto.createDecipheriv('aes128', key, key);
let Cupdate = cipheriv.update('63fc3b6fb3513831c3189d9eee92a1ed','hex','utf8');
Cupdate+=cipheriv.final('utf8')
console.log(Cupdate)
3.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
}