Ruby/Rails:每次加密特定字符串时如何获得相同的加密值

Sai*_*aim 1 ruby encryption deterministic ruby-on-rails

是否ActiveSupport::MessageEncryptor支持确定性加密,以便每次加密特定字符串时都获得相同的加密值?如果没有,是否还有其他支持确定性加密的Ruby库?

我的目标是每次加密字符串时获得相同的加密值,我也应该能够将其解密为原始值.

谢谢.

Tob*_*ias 5

你会得到不同的密码,因为加密的ActiveSupport::MessageEncryptor使用默认OpenSSL需要iv来防止攻击者推断加密消息的各段之间的关系.我强烈建议你不要乱用它,因为你打开攻击者推断加密密钥的方法.

但是,如果您仍想这样做,请查看ruby 的OpenSSL文档.应该有一种无矢量加密的方法.

因为它具有很高的安全风险,所以我不会在答案中添加代码来保护他人免受不必要的循环漏洞的影响.

  • 托比亚斯,谢谢你的说明,我理解安全风险.我们尝试加密的信息存储在安全的数据库中.我们需要使用WHERE子句中的加密列来过滤加密数据.我们已经讨论了相关的安全性,我们对这种方法没有问题.如果你能分享一个代码片段,我可能会被迫,如果我花了很多钱,可能会在以后删除它?再次感谢. (2认同)

Grz*_*orz -1

当然:只需使用相同的密钥即可获得相同的加密

x = ActiveSupport::MessageEncryptor.new('12345678901234567890123456789012').encrypt_and_sign('foo')
=> "bXJmRUczdjVXRFdLTitUcmkvRnk1UT09LS0vb2ZYdDRybGdWbmNXMUI1VDNnQzVBPT0=--13232bbe31d966f7d1df3aaa6fcc1cdc9eea60a1"
ActiveSupport::MessageEncryptor.new('12345678901234567890123456789012').decrypt_and_verify(x)
=> "foo"
Run Code Online (Sandbox Code Playgroud)

很难说为什么你会得到不同的结果,因为你没有发布任何代码......

  • 是的,它解密得很好。我想要的是每次加密字符串时一致/相同的加密值。 (2认同)