Rails中的加密 – 解密

我使用require 'digest/sha1'来加密我的密码并保存到数据库中。 在登录期间,我通过匹配保存在数据库中的加密密码进行身份validation,并再次加密,使用输入密码字段。 截至目前一切正常,但现在我想做’忘记密码’function。 为此,我需要解密保存在数据库中的密码以找到原始密码。 如何使用digest/sha1解密? 或者有没有人知道任何支持加密和解密的算法?

我在rails上使用ruby,所以我需要Ruby方法来完成它。

SHA1是单向函数,你不能反转它。

这可能是有趣的重新密码重置: http : //www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/

如果你想加密/解密,那么你应该使用像AES这样的东西。 但是,一旦开始使用加密/解密,您也必须开始担心密钥管理。

关于你对以下OP的评论 – 如果你打算存储CC信息,我建议你找一个谁知道加密,密钥管理等安全人员,谁也理解相关的法律和监管方面。

加密密码。 相反,存储密码的哈希值(更好地用盐)。

忘记密码通常意味着(重新)通过其他渠道进行身份validation,例如,密码重置的电子邮件通知。

如果您需要预先构建的东西,请观看http://railscasts.com/episodes/209-introducing-devise 。

编辑:如果你真的需要加密,google“openssl ruby​​”

从来没有一个安全工作的简单解决方案。 你的实现有多好,由弱点链接决定。

所以,我的建议是,不要指望SO的简短回答;-)

正如Horace Ho解释的那样,你永远不应该加密密码,而应该总是存储一个加密的盐。

但是,隐藏其他类型的数据(例如机密信息)是完全可以的。 加密器它是OpenSSL的一个简单但强大的包装器。 它提供了加密/解密任何类中的属性的能力。

看看ezcrypto gem: http ://ezcrypto.rubyforge.org/

还有隐藏gem,看看Blowfish: http : //crypt.rubyforge.org

要对其他数据库字段执行双向加密,请检查attr_enrypted gem

https://github.com/shuber/attr_encrypted

但正如其他人所说,你不想在密码上这样做。 密码应以单向存储。 对于忘记密码function,您通常会通过电子邮件向他们发送一个不可思议的url,让他们选择新密码。

这里有一个例子: http : //railscasts.com/episodes/274-remember-me-reset-password?view=asciicast