2

我正在尝试编写一个 Rails 应用程序,它可以让您将加密的密码存储在 Rails 数据库中。当你想存储密码时,你会在一个短语上调用 encrypt ,它会准确地告诉你生成的加密字符串是什么,你可以将它与特定的网站或帐户名一起存储,你将能够引用它在一张桌子上。然后,当您需要密码时,您可以选择该网站/密码对并对其进行解密以检索密码。我的问题是以下方案是否安全。

  1. 我将拥有一个绑定到用户的模型(例如,称为 SecretKeeper)。
  2. 当一个 SecretKeeper 被初始化时,它被一个 FastAES 对象的实例和一个密码(例如@aes = FastAES.new(secret_phrase))初始化
  3. 然后,当用户想要加密密码时,SecretKeeper 会调用Base64.urlsafe_encode64(@aes.encrypt([password].pack("m"))).slice(0..-2)返回编码字符串,然后将其存储在数据库中。
  4. 要解码,用户必须传入加密字符串以及“主”密码,该密码与用于创建 FastAES 对象的 secret_phrase 是分开的。此主密码以加密字符串的形式存储在与用户关联的数据库中(使用与上述第 3 条相同的方法)。为了验证这个主密码,当用户尝试解密密码时,我加密主密码并将其与数据库中的散列值进行比较以查看它是否匹配。如果是这样,然后我继续调用@aes.decrypt(Base64.urlsafe_decode64("#{encoded}=")).ljust(8, "\x00").unpack("m").first并返回结果字符串

    • 这是个好主意吗?或者我应该做些什么来让它更安全?
    • 我还计划添加一个密码盐,它将以明文形式存储在数据库中。我是否也应该计划对此进行加密?
4

1 回答 1

1

不,这不是一个安全的方案。

FastAES不是一个严肃的安全库 - 请参阅参考页面上关于作者不了解安全性的注释。

对于初学者 - 该方案使用ECB,它不提供完整性和非常有限的机密性保护。

我建议看一下rbNaCl 之类的东西(它仍然有安全警告,因为它没有受到与 NaCl 相同的关注,但与 FastAES 不同)。

于 2013-08-31T10:55:31.767 回答