【发布时间】:2010-10-04 21:05:55
【问题描述】:
我的应用上有一个用户模型,我的密码字段使用 sha1。我想要的是,当我从数据库中获取 sha1 时,将其再次变为字符串。我该怎么做?
【问题讨论】:
标签: ruby-on-rails sha1
我的应用上有一个用户模型,我的密码字段使用 sha1。我想要的是,当我从数据库中获取 sha1 时,将其再次变为字符串。我该怎么做?
【问题讨论】:
标签: ruby-on-rails sha1
您不能 - SHA1 是一种单向哈希。鉴于 SHA1(X) 的输出,无法检索 X(至少,没有暴力搜索或dictionary/rainbow table 扫描)
考虑这个问题的一个非常简单的方法是想象我给你一组三位数字相加,然后你告诉我这个和的最后两位数字。我不可能从这两个数字中准确地计算出您开始使用的数字。
另见
关于MD5的思考,这些其他问题也可能启发你:
【讨论】:
你不能——这就是 SHA1、MDB5 等的重点。其中大多数是用于安全的单向哈希。如果可以逆转,那么任何可以访问您的数据库的人都可以获得所有密码。那会很糟糕。
不要对您的数据库进行哈希处理,而是对密码尝试进行哈希处理并将其与数据库中的哈希值进行比较。
【讨论】:
如果您是从实际的角度来谈论这个,那么现在就放弃并认为这是不可能的。找到原始字符串 是不可能的(意外除外)。加密安全哈希的主要目的是确保您找不到任何产生相同哈希的 other 字符串。
如果您对安全哈希算法的研究感兴趣:找到将产生给定哈希的一个字符串称为“原像”。如果您能够设法为 SHA-1 做到这一点(具有合理的计算复杂性),您可能会在密码分析研究人员中相当有名。目前已知的针对 SHA-1 的最佳“突破”是一种找到两个产生相同哈希的输入字符串的方法,但是 1)它的计算成本非常高(想想许多机器以 24/7 的速度运行数月)是时候找到一个这样的对了),并且 not 是否适用于任意散列值 - 它会找到一类特殊的输入字符串之一,匹配对(相对)容易找到。
【讨论】:
SHA 是一种散列算法。您可以将用户提供的输入的哈希值与存储的哈希值进行比较,但您不能轻易地reverse 进程(从存储的哈希值重建原始字符串)。
除非您选择暴力破解或使用彩虹表(在提供足够长的输入时都非常慢)。
【讨论】:
SHA-1 无法做到这一点。但是,鉴于您需要做的,您可以尝试使用 AES。 AES 允许加密和解密。
【讨论】: