安装

  1. npm install crypro-js

使用

可以使用ES6的import语法,或者node.js的require语法

AES对称加密

  1. // 引入
  2. const cryptoJS = require('crypto-js')
  3. const AES = require('crypto-js/aes')
  4. // 测试对象
  5. const user = {
  6. name: 'lonzo',
  7. age: 23,
  8. password: 'qwert12345'
  9. }
  10. // 加密解密的密钥
  11. const secretKey = 'qdwqnwq123411kd'
  12. // 加密,JSON序列化要加密的对象
  13. let ciphertext = AES.encrypt(JSON.stringify(user), secretKey).toString()
  14. // 解密
  15. let originaltext = AES.decrypt(ciphertext, secretKey).toString(cryptoJS.enc.Utf8)
  16. console.log('加密前' + JSON.stringify(user))
  17. console.log('加密后' + ciphertext)
  18. console.log('解密后' + originaltext)

密钥

密钥是AES加密、解密的根本,需要使用同一个密钥
AES支持三种长度的密钥

  • AES128(性能最好)
  • AES192
  • AES256(安全性最高)

填充

为什么需要填充?

由于AES算法在对明文加密的时候,并不是把整个明文一次性加密成一段密文,而是将明文拆分成一个个独立的明文块,每一个明文块的长度128bit;
这些明文块经过AES加密处理生成一个个独立的密文块,这些密文块拼接在一起就是AES加密后的密文;
由于明文块的长度是按128bit来拆分的,所以当明文长度不是128的整数倍时,就会有长度不足128bit的明文块,这个时候就需要对其进行填充(padding)

填充有哪几种方式
  • NoPadding:不做任何填充,但是要求明文必须是16字节(128bit)的整数倍
  • PKCS5Padding(默认):如果明文块少于16字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数

    1. 明文: {1,2,3,4,5,a,b,c,d,e} 缺少6个字节
    2. =>PKCS5Padding补全后 {1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
  • ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数

    1. 明文: {1,2,3,4,5,a,b,c,d,e} 缺少6个字节
    2. =>ISO10216Padding补全后 {1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

    模式

    AES的工作模式,体现在加密过程中

  • CBC 电码本模式

  • ECB 密码分组链接模式(默认
  • CTR 计算器模式
  • CFB 密码反馈模式
  • OFB 输出反馈模式