1

この関数を PHP に変換しようとしていますが、どういうわけか同じ結果が得られません。

public static string EncodePassword(string pass, string salt) {
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Convert.FromBase64String(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    byte[] inArray = null;
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
    inArray = algorithm.ComputeHash(dst);
    return Convert.ToBase64String(inArray);
}

これはPHPでの私の見解です

function CreatePasswordHash($password, $salt) {
    $salted_password = base64_decode($salt).$password;
    $result = hash('SHA1',$salted_password,true);
    return base64_encode($result);
}

もちろん、それは機能しません。それで、私はここで何が間違っていますか?

テスト用の値は次のとおりです。

$salt         = 'Xh2pHwDv3VEUQCvz5qOm7w==';
$hashed_value = '0U/kYMz3yCXLsw/r9kocT5zf0cc=';
$password     = 'Welcome1!';

if ($hashed_value === CreatePasswordHash($password,$salt)) {
  echo "Good job!";
}

編集:MartyxとSlacksからの提案に基づく実用的なソリューション

function CreatePasswordHash($password, $salt) {
    $upass = mb_convert_encoding($password,'UCS-2LE','auto');
    $salted_password = base64_decode($salt).$upass;
    $result = hash('SHA1',$salted_password,true);
    return base64_encode($result);
}
4

2 に答える 2

2

PHP と C# で SHA1 を使用すると、C# では出力文字が大文字になり、PHP では小文字になりました。

C# と PHP で同じエンコーディングを使用することをお勧めします (UTF8 と UTF16 が適切な選択です)。

C# での選択肢:

  • Encoding.ASCII.GetBytes
  • Encoding.UTF8.GetBytes
  • ...

PHP のエンコード:

于 2010-08-18T20:38:09.370 に答える
2

UTF16 を使用してパスワード文字列をエンコードし、生のバイトとしてソルトをエンコードするように PHP に指示する必要があります。

于 2010-08-18T20:38:25.750 に答える