在ASP.net c#中复制PHPBB密码哈希算法

7
我目前正在使用phpbb 3.0.8。它有3,000个用户和约60,000篇帖子。我正在将论坛更改为另一个经典ASP编写的论坛(我知道人们会不赞同,但我有好的理由)。
我的网站是用ASP.net编写的。经典ASP论坛有一个API可以连接到它。我已经设置好了所有这些,并且它运行良好。我已经编写了自己的登录表单。
我想复制所有用户帐户。当前论坛有以下表:
Username | Password |  Hash  |  Salt

我已经重写了经典的ASP哈希技术,现在使用ASP.net Security.SHA1 哈希。密码存储为SHA1(rawpassword + salt)
我的计划是在当前字段旁边存储新字段:
UserID | Password |  Hash  |  Salt  |  PHPBBHash

用户登录时,如果已设置PHPBB哈希字段,则使用PHPBB哈希对密码进行哈希处理。然后,如果登录成功,它将删除PHPBBHash字段,并创建当前系统的哈希值。这样,从PHPBB到新论坛的过渡就会很顺利,没有人会失去他们的帐户。

我的问题是,在ASP.net c#中,如何验证PHPBB哈希,给定PHPBB哈希、用户名和密码?它是如何计算的?

我也担心经典ASP哈希函数声称为SHA1,但产生了与 Securiy.SHA1 不同的结果。

编辑

如果有人能给我一个明确的解决方案,我已经在此投放赏金,我感谢答案链接到资源,但我仍然难以理解。

测试用例

原始密码:

blingblangblaow222

在 PHPBB3 数据库中:

username: Tom
username_clean: tom
user_password: $H$9ojo08A3LuhnkXR27p.WK7dJmOdazh0
user_passchg: 1301433947
user_form_salt: 637f480dfdab84ef

使用Vishalgiris答案中的示例代码,我们可以这样做:
phpBB.phpBBCryptoServiceProvider cPhpBB = new phpBB.phpBBCryptoServiceProvider();
string remoteHash = "$H$9ojo08A3LuhnkXR27p.WK7dJmOdazh0";
bool result = cPhpBB.phpbbCheckHash("blingblangblaow222", remoteHash);
Response.Write("<BR><BR><BR>" + result);

这实际上返回true。太好了!但是有人知道为什么会这样吗?我很困惑,它似乎根本没有考虑盐。


他们说他们使用这个:http://www.openwall.com/phpass/,其中有一些C类,我需要进一步查看该文档。 - Tom Gullen
1
请注意我在这里的回答中的“P”与“H”的区别:https://dev59.com/MlXTa4cB1Zd3GeqPzCtO#5289595 - igorw
@Adam 是的,我会尝试今晚把它们放上去。 - Tom Gullen
2
@Tom:你提到它似乎没有考虑盐值。具体来说,它没有考虑user_form_salt。实际上,根据我链接的源代码,前4个字符后面的8个字符是哈希中使用的盐(salt)。大致过程如下:3个字符的魔术字符串($H$),1个字符表示哈希次数的指数(基于2,9- 2^9),8个字符的盐,后跟16个字符的哈希值。 - Adam Paynter
显示剩余3条评论
3个回答

6

3
似乎你的答案在phpBB社区这里,但是你已经知道了,它是加盐哈希,所以你需要使用链接中提供的函数来检查你的密码,因为每次生成哈希时都会更改。
如果你已经尝试过链接中提供的代码,请忽略此提示。
希望能帮到你...
另一个选项是创建单独的php页面/服务,进行密码哈希或哈希验证。要创建哈希,请使用“phpbb_hash”函数,要检查,请使用“phpbb_check_hash”,并且这些函数可以通过页面或服务向ASP或ASP.NET公开。

2
您还可以调整当前的Phpbb系统,以便在登录时存储输入密码的SHA1哈希值。如果您使用此调整一段时间,您将覆盖大多数活跃用户,这可以避免实现复杂算法的麻烦。不那么活跃的用户只需在无法登录时请求新密码,或者您可以为他们所有人提供一个新密码并通过电子邮件发送给他们(您可以选取存储在Phpbb数据库中的最后登录日期)。
根据您的需求,您可能还想涵盖Phpbb的自动登录功能。使用此功能的用户甚至可能不知道自己的密码,因此如果新系统不支持自动登录,则他们将无法登录。

谢谢你的回答,它很有用,但我正在寻找一个覆盖100%用户并对所有用户都无缝的解决方案。 - Tom Gullen
你可以检查一下你的PHPBB密码哈希值的大小。如果它们只有32个字符长,那么它们就是普通的MD5哈希值,但如果它们是34个字符长,那么它们就是由_hash_crypt_private算法生成的哈希值。如果你不想重写这段代码,你也可以在你的服务器上安装PHP并通过server.execute执行此函数。你只需要创建一个简单的PHP程序,在命令行上处理输入/输出,调用_hash_crypt_private函数即可。 - Kdeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接