为了账号安全,请及时绑定邮箱和手机立即绑定

将 PHP 的二进制部分 + 字符串部分的点连接转换为 C#

将 PHP 的二进制部分 + 字符串部分的点连接转换为 C#

C#
动漫人物 2021-06-04 09:05:51
我正在将一段 PHP 代码重写为 C#。此代码用于密码散列。在第一步中,它生成一个像“password{salt}”这样的字符串,然后通过 sha512 哈希算法对其进行哈希处理。之后,循环再次对第一个散列和盐的组合进行散列 5000 次迭代。PHP 代码如下所示:<?php$password = 'abc';$salt = 'def';$salted = $password.'{'.$salt.'}';$digest = hash('sha512', $salted, true);for ($i=1; $i<5000; $i++) {    $digest = hash('sha512', $digest.$salted, true);}$encodedPassword = base64_encode($digest);//$encodedPassword contains the final hash code我能够在没有循环的情况下让它工作(只有第一个 hash() 调用)。所以主散列和base64编码正确完成。我发现这部分是我无法用 C# 重写的:$digest.$salted$digest 似乎是一个二进制表示,因为 PHP 的 hash() 函数使用“true”作为最后一个参数(参见PHP hash - 手册)。$salted 是一个字符串。两者都被 PHP 的 dot / concat 运算符神奇地结合在一起。我想当使用带有非字符串操作数的点运算符时,会有某种从二进制到字符串的标准转换。到目前为止,这是我的代码:void Main(){    string password = "abc";    string salt = "def";    string salted = String.Format("{0}{{{1}}}", password, salt);    byte[] digest = hash(salted);    for(int i = 1; i < 1; i++)     {        digest = hash(String.Format("{0}{1}", System.Text.Encoding.UTF8.GetString(digest), salted));    }    var encodedPassword = System.Convert.ToBase64String(digest);    //$encodedPassword should contain the final hash code}static byte[] hash(string toHash) {    System.Security.Cryptography.SHA512 sha512 = new System.Security.Cryptography.SHA512Managed();    return sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(toHash));}如您所见,我尝试使用 System.Text.Encoding.UTF8.GetString() 将哈希字节转换回字符串,然后附加盐,但这不会产生与 PHP 代码相同的输出。如果有人可以帮助我,我会很高兴。非常感谢你。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信