前端开发数据传输加密方式之:AES加密

AES 加密

  • 块儿加密:块长度 128
  • 对称加密,每次迭代全加密(DES半加密)
  • 明文X轴,密文Y轴,加密迭代次数维数

攻击模式

PA: Padding attack  //(填充攻击)
CPA: Chosen Plaintext Attack //选择明文攻击
CCA: chosen-ciphertext attack //选择密文攻击

模式 (mode)

ECB 模式 (Electronic Code Book mode) 电子密码本模式

最简单的模式
弱点:相同的明文加密的算法和密钥相同,高风险模式;容易受PA(Padding attack)攻击
特点:加密解密独立不依赖,可同时进行了,明文被分割成多个块儿进行加密,最后一个块的长度不够需填充到128

CBC 模式 (Cipher block chaining mode) 密码块链接模式

特点:通过初始化向量实现 IV 与被加密的块相同的长度 IV 通常是一个随机数。在解密时,从两个邻接的密文块中即可得到一个明文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它明文的内容。
过程:将上一个加密的结果作为下一个加密的自由域 xor,加密同一段明文会得到不同的密文

加密过程是互相依赖的,不支持并行;解决方式

方案一:每次请求的加密都新生成一个AES 对象,这个方式降低了CBC模式的安全性,但比ECB模式还是更安全的。
方案二:可以请求的加密都新生成一个AES 对象,先对一段已知明文进行加密,然后将加密结果作为对提交的数据进行加密的IV,不会影响安全度。

padding

AES 是块加密,每个块有固定的长度 128,如果被加密对象长度不够,需要有padding 填充字符来拼凑128。

常用库

CryptoJs

// ECB 模式
```javascript
CryptoJS.AES.encrypt(word, key, {
    mode : CryptoJS.mode.ECB,
    padding : CryptoJS.pad.Pkcs7
});

// CBC 模式

CryptoJS.AES.encrypt(word, key, {
    mode : CryptoJS.mode.CBC,
    padding : CryptoJS.pad.Pkcs7,
    IV:'bvnnk123zkxvfkdmvk' //自定义
});

常用加密封装ECB模式

/**
 * AES ECB 模式加解密
 * @param {String} str  // 目标字符串
 * @param {String} key // 加密密钥
 * @output {String} aesEncrypt // 加密返回
 * @output {String} aesDecrypt //解密返回
 * @depence {.js} 'aes', 'mode-ecb-min', 'core', 'cipher-core', 'enc-base64' //依赖的 CryptoJs
 */
class AES_ECB {
    constructor(str, key) {
        this.str = typeof str === 'string' ? str : JSON.stringify(str)
        this.key = typeof str === 'string' ? key : JSON.stringify(key)
        this.opts = {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7,
        }
    }
    aesEncrypt() {
        return CryptoJS.AES.encrypt(this.str, this.key, this.opts).toString();
    }
    aesDecrypt() {
        return CryptoJS.AES.decrypt(this.str, this.key, this.opts).toString(CryptoJS.enc.Utf8);
    }
}
上一篇
下一篇