在 PHP 中匹配 128 个字符的密码哈希 - 使用 Ruby on Rails 加密
Posted
技术标签:
【中文标题】在 PHP 中匹配 128 个字符的密码哈希 - 使用 Ruby on Rails 加密【英文标题】:Matching 128 character password hash in PHP - encrypted with Ruby on Rails 【发布时间】:2012-12-18 20:20:48 【问题描述】:我们有一个用 Ruby on Rails 构建的网站。 用户注册是通过 Ruby 中的站点处理的,密码使用 Ruby 的 SHA1.HexDigest 函数进行哈希处理,每个用户使用不同的盐。 我需要做的是 - 在 php 中创建一个 web 服务,它将登录已经在网站上注册的用户。 为此,我需要从用户输入中生成相同的哈希值。 由于我对 Ruby 的了解几乎为零,因此我对如何使用 PHP 重现相同内容进行了大量研究。我浏览了以下链接,但无济于事。 How to generate the password in PHP as it did by Devise Gem in Ruby on Rails
Ruby 还会多次处理/散列输入(即延伸,您可以在 Ruby 中称之为)。
保存在数据库中的哈希长度为 128 个字符。 加盐长度为 20 个字符。
不知道是不是也用了某种胡椒粉。
例子,
用户输入 = 123456 盐 = g0i3A51x0xa7wrfWCMbG
数据库密码(128 个字符哈希)= 5374f9853f96eaa5b3c1124f9eb1dbbb63fb5c5ce40abb41ec88c745ec3455328685f3046cac8c356a4d81dbd315fd09173c54dc94a4208e577b2eb2b
如果有人可以使用上面给出的用户输入和盐,用 PHP 复制相同的哈希,那么请分享代码。 请帮忙。 这对我们很有帮助。
谢谢
class Sha1 < Base
# Gererates a default password digest based on stretches, salt, pepper and the
# incoming password.
def self.digest(password, stretches, salt, pepper)
digest = pepper
stretches.times digest = self.secure_digest(salt, digest, password, pepper)
digest
end
private
# Generate a SHA1 digest joining args. Generated token is something like
# --arg1--arg2--arg3--argN--
def self.secure_digest(*tokens)
::Digest::SHA1.hexdigest('--' << tokens.flatten.join('--') << '--')
end
【问题讨论】:
128 个十六进制数字是 512 位; SHA-1 的输出只有 160 位。这是 SHA-512 哈希吗? Devise 是 Ruby 应用程序中使用的库吗? 查看上面已编辑问题中的代码。 【参考方案1】:上述 Ruby 代码的直接翻译是:
function hashPassword($password, $stretches, $salt, $pepper)
$digest = $pepper;
for ($i = 0; $i < $stretches; $i++)
$digest = sha1("--$salt--$digest--$password--$pepper--");
return $digest;
要使用 SHA-512(128 十六进制数字输出)而不是 SHA-1(40 十六进制数字输出),请将 sha1(...)
替换为 hash('sha512', ...)
。
我无法根据您发布的哈希检查此代码,因为“胡椒”是我不知道的秘密配置设置。如果没有配置,试试空字符串。
【讨论】:
其实我确实试过上面的代码。但结果又是负面的。我已经尝试了许多不同的方法,但没有得到任何结果。如果您可以使用 PHP 生成与给定盐和用户输入的问题中相同的哈希,那将非常有帮助。我只需要一种与 PHP 产生相同哈希的方法。请指导我或操纵一些笨拙的方式或任何东西。【参考方案2】:我会从两边的简单散列程序开始,拉伸和加盐很好,但从没有这些开始,在两边做一个简单的散列,看看你是否能让它们对齐。然后你可以稍后再添加盐/拉伸。
在 ruby 方面,从以下内容开始:
require 'digest/sha1'
Digest::SHA1.hexdigest(string)
当你hash你无法解密时,你必须在两边进行hash并比较结果。
如果你真的想加密然后解密,试试这个:
http://jnylund.typepad.com/joels_blog/2007/11/cross-language-.html.
【讨论】:
以上是关于在 PHP 中匹配 128 个字符的密码哈希 - 使用 Ruby on Rails 加密的主要内容,如果未能解决你的问题,请参考以下文章
PHP,可以吗?将密码哈希中的字符串作为主键存储在数据库中?