我正在尝试编写一个Rails应用程序,它可以让您在Rails数据库中存储加密密码。当你想存储一个密码时,你会调用一个短语进行加密,并且它会向你显示加密字符串到底是什么,你可以将它与特定的网站或帐户名称一起存储,你可以参考它在桌子上。然后,当您需要密码时,您可以选择该网站/密码对并解密以检索密码。我的问题是这个下面的方案是否安全。这种加密方案在Rails应用中存储密码有多安全?
- 我将有这个模型(例如称为SecretKeeper),它将绑定到用户。
- 当SecretKeeper被初始化,它与FastAES对象的实例和一个密码初始化(例如
@aes = FastAES.new(secret_phrase)
) - 然后,当用户想要加密密码,SecretKeeper会再打电话
Base64.urlsafe_encode64(@aes.encrypt([password].pack("m"))).slice(0..-2)
返回编码字符串,然后将其存储在数据库中。 要进行解码,用户必须将加密的字符串与“主”密码一起传递,该密码与用于创建FastAES对象的secret_phrase分开。该主密码作为加密字符串存储在与用户关联的数据库中(使用与上面第3部分中所述相同的方法)。要验证此主密码,当用户尝试解密密码时,我会加密主密码并将其与数据库中的散列值进行比较,以查看它是否匹配。如果确实如此,则我继续致电
@aes.decrypt(Base64.urlsafe_decode64("#{encoded}=")).ljust(8, "\x00").unpack("m").first
并返回得到的字符串- 那么这是一个好主意吗?还是有什么我应该做的,以使其更安全?
- 我也计划添加一个密码盐,它将以明文形式存储在数据库中。我应该计划加密吗?
你为什么要加密*,而不是哈希,盐渍等? – delnan
我需要能够解码密码才能显示给用户,例如这个工具是为了能够提醒用户他们对不同应用/网站的密码是什么(假设他们在每个站点使用不同的密码)。 – tanookiben
我不能评论大部分的算法,但AES加密中缺乏IV是令人不安的。 http://stackoverflow.com/a/9050752/1517648 – Steve