7

我目前正在使用 phpbb 3.0.8。它有 3,000 名用户和大约 60,000 个帖子。我正在将论坛更改为不同的论坛,用经典的 ASP 编写(我知道人们会不赞成这一点,但我有充分的理由)。

我的网站是用 ASP.net 编写的。经典的 ASP 论坛有一个 API 可以连接到它。我已经设置了所有这些,并且工作正常。我已经编写了自己的登录表单。

我想复制所有用户帐户。当前论坛有表:

Username | Password |  Hash  |  Salt

我已经覆盖了经典的 ASP 散列技术,现在使用 ASP.netSecurity.SHA1散列。密码存储为SHA1(rawpassword + salt).

我的计划是将新字段与当前字段一起存储:

UserID | Password |  Hash  |  Salt  |  PHPBBHash

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

我的问题是,给定 PHPBB 哈希、用户名和密码,在 ASP.net c# 中如何验证 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。极好的!但是有谁知道为什么会这样?我很困惑,它似乎根本没有考虑到盐。

4

3 回答 3

6

PHPBB 似乎通过源文件中的phpbb_check_hash函数验证密码。看起来它通常依赖于做真正的工作。该函数有 57 行长(包括大量空格),因此将其转换为 C# 应该相对简单。functions.php_hash_crypt_private

于 2011-03-21T12:45:29.340 回答
3

似乎您的答案在 phpBB community,但是您已经知道,它是加盐哈希,因此您需要使用链接中提供的函数来检查您的密码,因为哈希会在生成时更改。

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

希望能帮助到你...


另一种选择是创建单独的 php 页面/服务,以进行密码散列或散列验证。创建使用“phpbb_hash”函数并检查使用“phpbb_check_hash”,这些函数可以通过页面或服务暴露给 ASP 或 ASP.NET。

于 2011-03-27T23:02:30.410 回答
2

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

根据您的需要,您可能还需要介绍 Phpbb 的自动登录功能。使用此功能的用户甚至可能不知道他们的密码,因此如果新系统不支持自动登录,他们将无法登录到您的新系统。

于 2011-03-24T21:58:13.737 回答