Rails中的加密 - 解密

时间:2010-04-26 07:27:12

标签: ruby-on-rails ruby encryption

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

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

5 个答案:

答案 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