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

C# 在ASP.net c中复制PHPBB密码哈希#,c#,asp.net,hash,phpbb,C#,Asp.net,Hash,Phpbb,目前我正在使用PHPBB3.0.8。它有3000个用户和大约60000个帖子。我正在把论坛改成一个不同的论坛,用经典ASP编写(我知道人们会不赞成这个,但我有很好的理由) 我的网站是用ASP.net编写的。经典的ASP论坛有一个API连接到它。我已经准备好了,一切正常。我已经写了我自己的登录表 我想复制所有的用户帐户。目前的论坛有以下表格: Username | Password | Hash | Salt 我已经跳过了经典的ASP哈希技术,现在使用ASP.netSecurity.SHA

目前我正在使用PHPBB3.0.8。它有3000个用户和大约60000个帖子。我正在把论坛改成一个不同的论坛,用经典ASP编写(我知道人们会不赞成这个,但我有很好的理由)

我的网站是用ASP.net编写的。经典的ASP论坛有一个API连接到它。我已经准备好了,一切正常。我已经写了我自己的登录表

我想复制所有的用户帐户。目前的论坛有以下表格:

Username | Password |  Hash  |  Salt
我已经跳过了经典的ASP哈希技术,现在使用ASP.net
Security.SHA1
hash。密码存储为
SHA1(rawspassword+salt)

我的计划是在当前字段旁边存储新字段:

UserID | Password |  Hash  |  Salt  |  PHPBBHash
用户登录时,如果设置了PHPBB hash字段,则会使用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 answer中的示例代码,我们可以这样做:

phpBB.phpBBCryptoServiceProvider cPhpBB = new phpBB.phpBBCryptoServiceProvider();
string remoteHash = "$H$9ojo08A3LuhnkXR27p.WK7dJmOdazh0";
bool result = cPhpBB.phpbbCheckHash("blingblangblaow222", remoteHash);
Response.Write("<BR><BR><BR>" + result);
phpBB.phpBBCryptoServiceProvider cPhpBB=新的phpBB.phpBBCryptoServiceProvider();
字符串remoteHash=“$H$9ojo08A3LuhnkXR27p.WK7dJmOdazh0”;
bool result=cPhpBB.phpbbCheckHash(“blingblangblaow222”,remoteHash);
响应。写入(“


”+结果);

这实际上是真的。超级的!但有人知道为什么会这样吗?我很困惑,它似乎根本没有考虑盐。

看来PHPBB通过中的验证密码。它看起来像是典型地依靠它来完成真正的工作。该函数有57行长(包括大量空格),因此将其转换为C#应该相对简单。

您还可以调整当前的Phpbb系统,以便它存储登录期间输入的密码的散列。如果您使用此调整运行一段时间,将覆盖大多数活动用户,这将为您省去实现复杂算法的麻烦。不太活跃的用户可以在无法登录时请求新密码,或者您可以给他们一个新密码并将其发送给他们(您可以在Phpbb数据库中存储的最后登录日期选择他们)

根据您的需要,您可能还希望涵盖Phpbb的自动登录功能。使用此功能的用户可能甚至不知道自己的密码,因此,如果您的新系统不支持自动登录,他们将很难登录

看起来您的答案是,但是正如您所知,它是盐哈希,因此您需要使用链接中提供的函数来检查密码,因为哈希在生成时会发生变化

如果您已经尝试了链接中提供的代码,请忽略

希望对你有帮助


还有一个选择是创建单独的php页面/服务,进行密码哈希或哈希验证。
要创建并使用“phpbb\u hash”函数,要选中并使用“phpbb\u check\u hash”,这些函数可以通过页面或服务向ASP或ASP.NET公开。

,其中链接到,但是另一个问题海报说它不起作用,而且还没有解决方案。他们说他们使用这个:它有一些C类,我必须进一步研究这个文档。嗯,我可以安装PHP,并向PHP页面发出XMLHTTP请求,该页面为我做哈希,开始与经典ASP有点混乱,不过ASP.net和PHP都在一个网站上!请注意我在这里的回答中的“P”和“H”的区别:@Tom:你提到它似乎没有考虑盐。具体来说,它没有考虑
user\u form\u salt
。实际上,前4个字符后面的8个字符是散列中使用的salt(基于我链接到的源代码)。大致是这样的:3个字符的魔术字符串(
$H$
),1个字符表示散列次数的指数(基数2,
9
-2^9),8个字符的salt,然后是16个字符的散列。感谢您的回答,这很有用,但我正在寻找一种解决方案,它可以覆盖100%的用户,并且对所有用户都是无缝的。如果它们只有32个字符长,则它们只是常规MD5哈希,但如果它们有34个字符长,则它们是由_hash_crypt_private算法生成的哈希。如果不想重写此代码,还可以在服务器上安装PHP,并通过server.execute执行此函数。您只需要创建一个简单的PHP程序,该程序将在调用_hash_crypt_private函数的命令行上处理输入/输出。