我目前使用的是 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 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。极好的!但是有谁知道为什么会这样?我很困惑,它似乎根本没有考虑盐分。
最佳答案
PHPBB 似乎通过 phpbb_check_hash
function 验证密码在functions.php
source file .看起来它通常依赖于 _hash_crypt_private
做真正的工作。该函数长 57 行(包括大量空格),因此将其转换为 C# 应该相对简单。
关于c# - 在 ASP.net c# 中复制 PHPBB 密码散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5376494/