C# emulating php crypt

本文关键字:crypt php emulating | 更新日期: 2023-09-27 18:11:37

我需要用c#对密码进行散列处理,以使其他软件能够理解它。原来php的crypt函数就是这样做的。它有以下输出

$6$rounds=1000$1f$yeKGQo0b8MqqMpocFla8uKLE6GOpEygSQUH4qMi4msJZsD50Eh00bU4GwoGGPEeLMdG6C17ehl/l8SrcOABdC0

我猜是SHA512。如何用c#实现php的crypt功能?

原PHP

$salt = '$6$rounds=1000$'.dechex(rand(0,15)).dechex(rand(0,15)).'$';
$crypted = crypt($password, $salt);

C# emulating php crypt

CryptSharp会对所有常见的crypt变化进行计算。

生成SHA-512加盐哈希(该算法的默认轮数为5000):

using CryptSharp;
string hash = Crypter.SHA512.Crypt(password);

使用自定义轮数:

var saltOptions = new CrypterOptions() { { CrypterOption.Rounds, 10000 } };
string salt = Crypter.SHA512.GenerateSalt(saltOptions);
string hash = Crypter.SHA512.Crypt(password, saltOptions);

验证哈希:

bool matched = Crypter.CheckPassword(testPassword, hash);

另一个注意事项,原始PHP应该是真正安全的。salt只有8位,使用rand生成(使用openssl_random_pseudo_bytes代替)。该散列特别选择默认轮数的五分之一。