【问题标题】:Is AES-256 encryption consistent?AES-256 加密是否一致?
【发布时间】:2018-05-17 09:32:27
【问题描述】:

我的服务器遇到了一个问题,这让我提出了一个问题 - AES-256 加密是否可靠一致?

所以我的节点服务器,为了避免 DDOS 漏洞,同时保持用户数据匿名,从请求中获取一个 IP,对其进行加密,并存储它在过去 24 小时内发出请求的次数。

它通过使用完全相同的密码重新加密 IP 来检查用户是否在过去 24 小时内提出了请求。然后,它将它与 first 存储的 IP 相匹配。

然后:

Error: Can't find data: /ipcount/d00c526612cec9e5d3e201af35993c75. Stopped at ipcount

d00c526612cec9e5d3e201af35993c75 应该是加密字符串,但数据库的行为就像以前从未见过一样。那么我可以让它使用相同的密码进行一致的加密吗?

提前致谢。

这里是加密函数...

const crypto = require('crypto'),
    algorithm = 'aes-256-ctr',
    password = 'aSecureNotSharedOverAForumPassword'

function encrypt(text){
   var cipher = crypto.createCipher(algorithm,password)
  var crypted = cipher.update(text,'utf8','hex')
  crypted += cipher.final('hex');
  return crypted;
}

【问题讨论】:

  • 我添加了一个捕获try...catch 的错误并且它起作用了......但我仍然想要一个答案
  • 在相同的输入、模式等条件下,AES 加密是一致的。如果不一致,它将没有用处。不一致的使用会产生不一致的结果。
  • 加密它并不能让它保持匿名,因为它可以很容易地被解密。像 bcrypt 这样的东西可能更合适。
  • 对;其他人也说过的话。做了一个节点版本
  • 加密是解决这个问题的错误工具。任何加密哈希都会更合适。 SHA-256 广泛可用。见crypto.createHash

标签: encryption cryptography aes


【解决方案1】:

根据 Node.js documentation for crypto:

建议开发人员使用 crypto.pbkdf2() 自行派生密钥和 IV,并使用 crypto.createCipheriv() 创建 Cipher 对象。用户不应在 crypto.createCipher() 中使用具有计数器模式的密码(例如 CTR、GCM 或 CCM)

因此,您所经历的行为本身并不完全是一种已定义的行为。我的猜测是,底层密码对象会为您的 CTR 模式随机生成一个随机数,因此每次输出都不同。

要解决此问题,请按照文档的建议使用 crypto.createCipheriv 并自己生成随机数。这样您就可以存储 nonce 并使用它来生成相同的输出流。

【讨论】:

  • 谢谢,就像我说的,我尝试使用我自己的密码设置一个变量,并尝试捕获,它成功了。
【解决方案2】:

对于正在寻找的其他人,不要使用相同的随机数。它带走了 AES 的所有安全保证。请查看此线程:CryptoJS AES encryption with ECB mode produces different results with the same params

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多