我目前正在使用phpbb 3.0.8。它有3,000个用户和约60,000篇帖子。我正在将论坛更改为另一个经典ASP编写的论坛(我知道人们会不赞同,但我有好的理由)。
我的网站是用ASP.net编写的。经典ASP论坛有一个API可以连接到它。我已经设置好了所有这些,并且它运行良好。我已经编写了自己的登录表单。
我想复制所有用户帐户。当前论坛有以下表:
我已经重写了经典的ASP哈希技术,现在使用ASP.net
我的计划是在当前字段旁边存储新字段:
使用Vishalgiris答案中的示例代码,我们可以这样做:
我的网站是用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。太好了!但是有人知道为什么会这样吗?我很困惑,它似乎根本没有考虑盐。
user_form_salt
。实际上,根据我链接的源代码,前4个字符后面的8个字符是哈希中使用的盐(salt)。大致过程如下:3个字符的魔术字符串($H$
),1个字符表示哈希次数的指数(基于2,9
- 2^9),8个字符的盐,后跟16个字符的哈希值。 - Adam Paynter