我正在使用require 'digest/sha1'
来加密我的密码并保存到数据库中。在登录期间,我通过匹配保存在数据库中的加密密码进行身份验证,并再次加密,使用输入密码字段。截至目前一切正常,但现在我想做'忘记密码'功能。为此,我需要解密保存在数据库中的密码以找到原始密码。如何使用digest/sha1
解密?
或者有人知道任何支持加密的算法吗?还解密?
我在rails上使用ruby,所以我需要Ruby方法来实现它。
答案 0 :(得分:10)
SHA1是单向函数,你不能反转它。
这可能是重要的密码重置: http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/
如果您想进行加密/解密,那么您应该使用类似AES的内容。但是,一旦开始使用加密/解密,您也必须开始担心密钥管理。
关于您对下面的OP的评论 - 如果您要存储CC信息,我建议您找一位知道加密,密钥管理等的安全人员,并了解相关的法律和监管方面。
答案 1 :(得分:6)
不加密密码。相反,存储密码的哈希值(更好的用盐)。
忘记密码通常意味着(重新)通过其他渠道进行身份验证,例如,密码重置的电子邮件通知。
如果您需要预先构建的内容,请观看http://railscasts.com/episodes/209-introducing-devise。
编辑:如果你真的需要加密,google“openssl ruby”
从来没有一个安全工作的简单解决方案。您的实施有多好,由弱点链接决定。
所以,我的建议是,不要指望关于SO的简短回答; - )
答案 2 :(得分:2)
正如Horace Ho所解释的那样,你永远不应该加密密码,而是始终存储一个加密的盐。
然而,隐藏其他类型的数据(例如机密信息)是完全可以的。 Encryptor这是一个简单但功能强大的OpenSSL包装器。它提供了加密/解密任何类中的属性的能力。
答案 3 :(得分:1)
查看ezcrypto gem:http://ezcrypto.rubyforge.org/
还有地穴宝石,请看Blowfish:http://crypt.rubyforge.org
答案 4 :(得分:1)
要对其他数据库字段执行双向加密,请检查attr_enrypted
gem
https://github.com/shuber/attr_encrypted
但正如其他人所说,你不想在密码上这样做。密码应以单向存储。对于忘记密码功能,您通常会通过电子邮件向他们发送一个不可思议的网址,让他们选择新密码。
这里有一个例子:http://railscasts.com/episodes/274-remember-me-reset-password?view=asciicast