C#中与PHP的原始输出MD5等效的方法是什么?

4

我试图实现一个“简化版”的(远程)WordPress登录。

我已经完成了一部分,但当涉及到WordPress算法加密密码时,我有些困惑。下面是从“class-phpass.php”中的代码片段(WP用于哈希密码)...

$hash = md5($salt . $password, TRUE);
do {
    $hash = md5($hash . $password, TRUE);
} while (--$count);

根据PHP 5手册 -
string md5 ( string $str [, bool $raw_output = false ] )

"If the optional raw_output is set to TRUE, then the md5 digest is instead returned in raw binary format with a length of 16."
为了在C#中实现此功能,我目前正在使用下面的代码,可以在这里找到:here:
public string Md5Sum(string strToEncrypt)
{
    System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
    byte[] bytes = ue.GetBytes(strToEncrypt);

    // encrypt bytes
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    byte[] hashBytes = md5.ComputeHash(bytes);

    // Convert the encrypted bytes back to a string (base 16)
    string hashString = "";

    for (int i = 0; i < hashBytes.Length; i++)
    {
        hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');
    }

    return hashString.PadLeft(32, '0');
}

正如您所看到的,这个C#版本与PHP版本相当,但将FALSE作为第二个参数传递。我通过比较两个版本的输出来验证了这一点。

此外,WordPress版本传递TRUE。我正在努力将此更改应用于C#版本。

以下是PHP代码的C#等效代码:

$hash = md5($salt . $password, TRUE);

WordPress多年来已经不再使用MD5进行密码哈希处理...但如果您正在使用旧版安装程序,这仍然可能是情况(但我没有使用任何旧版WP站点,因此无法验证)。 - BoltClock
好的,我误读了你的问题。你的WordPress版本确实使用了PHPass,而且你基本上是在将PHPass移植到C#中——你并不是真正地尝试仅使用MD5来哈希密码。现在你的问题更有意义了。 - BoltClock
正如BoltClock所述,我需要将PHPPass移植到C#(简而言之),并且我没有太多可以改变的余地 - MD5是我必须使用的。话虽如此,如果我(不知何故)升级到最新的WP版本,这会让我的生活更轻松吗? - Marc Thompson
我的原始评论是错误的,抱歉。WordPress仍然使用PHPass来哈希密码,但除了用于身份验证用户的PHP函数外,它没有提供任何其他功能。有一个REST API插件正在开发中,但我不知道它是否在这里有用。 - BoltClock
2个回答

5
原始输出指的是实际的字节,您不需要将它们转换为base16字符串。
public static byte[] Md5Sum_Raw(string strToEncrypt)
{
    System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
    byte[] bytes = ue.GetBytes(strToEncrypt);

    // encrypt bytes
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    return md5.ComputeHash(bytes);
}

PHP:

$s = md5('1234567890', true);
for ($i=0; $i < strlen($s); $i++)
    echo ord($s[$i]) . ' ';

232 7 241 252 248 45 19 47 155 176 24 202 103 56 161 159

C#:

byte[] hash = Md5Sum_Raw("1234567890");
for (int i = 0; i < hash.Length; i++)
    System.Console.Out.Write(hash[i] + " ");
System.Console.Out.WriteLine();

232 7 241 252 248 45 19 47 155 176 24 202 103 56 161 159

谢谢,Lashane - 这就是我最初的想法。但是在下一次(循环)调用MD5时,使用先前的结果有点让我困惑。也就是说,在PHP中,byte[]是字符串,因此可以直接传递给下一个调用。但是在C#中,这该怎么做呢? - Marc Thompson
正如您所看到的,MD5提供程序使用字节,您需要将字符串转换为它才能使其工作。 - Iłya Bursov
是的,我明白了。但是如果您仔细观察对MD5的循环调用,您会发现PHP byte[](或字符串)附加了密码,而在C#中将其作为字符串。虽然我确实将其转换为byte[],但是在C#中,PHP的字节数组连接映射为什么(其中它们不被视为字符串)。 - Marc Thompson
只需将字节数组附加到另一个字节数组即可。 - Iłya Bursov
是的,谢谢。我刚刚尝试了一下,成功了。总的来说,我的困惑在于PHP将byte[]视为字符串。但还是谢谢你。 :) - Marc Thompson

0

1
欢迎来到 Stack Overflow!请不要粘贴代码图片链接。最好将您的代码复制/粘贴到您的答案中。 - help-info.de
1
仅提供代码的答案被认为是低质量的:请确保提供解释,说明您的代码是如何解决问题的。 - help-info.de

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