我获得了C#代码,我正在尝试使用Perl生成等效的SHA1。
public string GetHashedPassword(string passkey)
{
// Add a timestamp to the passkey and encrypt it using SHA1.
string passkey = passkey + DateTime.UtcNow.ToString("yyyyMMddHH0000");
using (SHA1 sha1 = new SHA1CryptoServiceProvider())
{
byte[] hashedPasskey =
sha1.ComputeHash(Encoding.UTF8.GetBytes(passkey));
return ConvertToHex(hashedPasskey);
}
}
private string ConvertToHex(byte[] bytes)
{
StringBuilder hex = new StringBuilder();
foreach (byte b in bytes)
{
if (b < 16)
{
hex.AppendFormat("0{0:X}", b);
}
else
{
hex.AppendFormat("{0:X}", b);
}
}
return hex.ToString();
}
与:
相同use Digest::SHA1 qw( sha1_hex );
my $pass = "blahblah";
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime();
$year += 1900;
my $date = sprintf("%d%02d%02d%02d0000", $year, $mon+1, $mday, $hour);
my $passSha1 = sha1_hex($pass.$date);
//9c55409372610f8fb3695d1c7c2e6945164a2578
我实际上没有任何C#经验,所以我无法测试通常从C#代码输出的内容。
该代码应该用作网站的校验和,但我提供的代码是失败的。
编辑:它还会在散列之前将UTC时间戳(yyyyMMDDHH0000)添加到传递的末尾,因此我已添加该代码以防出现问题。
答案 0 :(得分:5)
我也不知道C#。但是,{0:X}
使用大写字母格式化十六进制数字。那么,
my $passSha1 = uc sha1_hex($pass);
帮助? (假设GetHashedPassword
有意义。)
答案 1 :(得分:4)
我能看到的唯一区别(从运行Visual Studio 2008下的代码)是C#代码返回带有大写字母的十六进制字符串
D3395867D05CC4C27F013D6E6F48D644E96D8241
并且perl代码使用小写字母
d3395867d05cc4c27f013d6e6f48d644e96d8241
C#代码中使用的格式字符串要求大写(“X”而不是“x”):
hex.AppendFormat("{0:X}", b);
也许网站上的代码使用区分大小写的比较?我假设在提交之前将CPAN函数的输出转换为大写是很简单的吗?
答案 2 :(得分:2)
是否可以像将X
调用中的大写“AppendFormat
”更改为小写“x
”一样简单?
答案 3 :(得分:0)
我认为你正在寻找Digest::SHA1
答案 4 :(得分:0)
您的SHA-1也可能只是:
BitConverter.ToString(SHA.ComputeHash(buffer)).Replace("-", "");