【问题标题】:Using AES-256-ctr to encode Id使用 AES-256-ctr 对 Id 进行编码
【发布时间】:2021-04-14 20:06:28
【问题描述】:

我正在使用 Node 的加密原生 api 对 id 进行编码,因为它将显示在 URL 参数中,问题是,它以一种可以猜到的方式进行编码,我无法理解为什么,这是我的代码.

const encrypt = (key, value) => {
const iv = crypto.randomBytes(16);

const cipher = crypto.createCipheriv('aes-256-ctr', Buffer.from(key), iv);
let encrypted = cipher.update(value);
encrypted = Buffer.concat([encrypted, cipher.final()]);

return `${iv.toString('hex')}-${encrypted.toString('hex')}`;
}

发生的情况是 AES 编码的 id 以可预测的方式输出,例如,数字 5 输出代码 160f20bea36be22f90b092f876f1abdd-55 并注意如果我将最后两个数字更改为 56,则输出变为 6 或 54 , id 被发现,因为它输出 7。

我想要它做的是给我一个安全编码的 id。

【问题讨论】:

    标签: javascript cryptography aes


    【解决方案1】:

    您的输出可预测性问题来自您使用CTR 模式这一事实。让我们看看CTR 模式是如何工作的:

    CTR 是一种流媒体模式。如您所见,CTR 模式的工作原理是使用您的纯数据加密从1XORing 结果开始的计数器。这张图片中的 Nonce 是IV。正如您所提到的,这种机制有一个缺点。如果我们假设C(i) 是加密计数器i,我们有:

    Cipher(i) = Plain(i) xor C(i)
    

    由于C(i)不依赖于输入,如果你改变Plain(i)Cipher(i)将根据你的Plain(i)改变而改变:

    Cipher(i) = Plain(i) xor C(i) => C(i) = Cipher(i) xor Plain(i)
    then for block i:
    Cipher(x) = Plain(x) xor C(i) => Cipher(x) = Plain(x) xor Cipher(i) xor Plain(i)
    

    XOR 是加无进位。这就是为什么你觉得你的结果是可以预测的。但这只会发生如果您的IV 是固定的,因此会显示IVCTR 模式下的重要性。

    我应该说你的代码一般没有任何主要问题,因为你使用:

    const iv = crypto.randomBytes(16);
    

    每次生成一个新的IV 用于加密并将该IV 添加到您的编码结果中。由于您每次都更改IV,因此C(i) 对于每个加密数据都会有所不同,没有人可以猜出新的加密数据。举个例子:

    input data              encrypted output
    ---------------------------------------------------
    5               160f20bea36be22f90b092f876f1abdd-16
    6               160f20bea36be22f90b092f876f1abdd-15  // Feels predictable since IV is similar
    
    6               160f20bea36be22f90b092f876f1abde-ee  // Sample input, but completely deferent 
                                                         // output since I changed 1 bit in IV
    

    因此,一般而言,您的代码在密码学方面没有任何重大问题。但是由于您需要在结果中保留IV 进行解密,因此您的加密数据结果会很大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 2020-09-26
      • 2014-08-05
      • 2018-04-15
      • 1970-01-01
      • 2020-01-20
      • 2013-04-23
      相关资源
      最近更新 更多