【问题标题】:Encryption-Decryption in RailsRails 中的加密-解密
【发布时间】:2010-04-26 07:27:11
【问题描述】:

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

我在 Rails 上使用 ruby​​,所以我需要 Ruby 方式来完成它。

【问题讨论】:

  • 一个更好的选择是不允许恢复。如果用户忘记了,那么让用户选择一个新的。这是最安全、最便宜的方法。

标签: ruby-on-rails ruby encryption


【解决方案1】:

SHA1 是一种单向函数,您无法反转它。

这可能对密码重置感兴趣: http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/

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

关于您对以下 OP 的评论 - 如果您要存储 CC 信息,我建议您找一位了解加密、密钥管理等并且还了解相关法律和监管方面的安全人员。

【讨论】:

  • 好的,那么我想知道我应该能够解密的任何 2way 算法。请在“Horace Ho”给出的答案下方查看我之前的评论
【解决方案2】:

不要加密密码。相反,存储密码的哈希值(最好使用盐)。

忘记密码通常意味着通过另一个渠道(重新)进行身份验证,例如密码重置的电子邮件通知。

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

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

安全工作从来没有简单的解决方案。 weakness 链接决定了你的实现有多好。

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

【讨论】:

  • 我需要它,因为将来我想保存一些机密数据,例如:- 信用卡号。所以我也需要解密。
【解决方案3】:

正如 Horace Ho 所解释的,您永远不应该加密密码,而应始终存储加密的盐。

但是,加密其他类型的数据(例如机密信息)完全没问题。 Encryptor 这是一个简单但功能强大的 OpenSSL 包装器。它提供了对任何类中的属性进行加密/解密的能力。

【讨论】:

  • 在使用它时,当我将加密数据保存到数据库时出现问题
【解决方案4】:

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

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

【讨论】:

  • 您链接的两个项目似乎自 2006 年以来都没有更新过。
【解决方案5】:

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

https://github.com/shuber/attr_encrypted

但正如其他人所提到的,您不希望对密码执行此操作。密码应该以一种方式存储。对于忘记密码的功能,您通常会通过电子邮件向他们发送一个无法猜测的 URL,让他们选择新密码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多