我得到C#代码和我试图产生等效SHA1使用Perl。

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)至传输的结束散列所以我添加了的情况下的代码的问题是存在的前

有帮助吗?

解决方案

我不知道C#两种。然而,{0:X}使用大写字母格式十六进制数字。这样,将

my $passSha1 = uc sha1_hex($pass);

帮助? (假设GetHashedPassword是有意义的。)

其他提示

我可以看到(从运行Visual Studio 2008下的码)的唯一差别是,在C#代码以大写阿尔法返回十六进制字符串

  

D3395867D05CC4C27F013D6E6F48D644E96D8241

和perl的代码是使用用于阿尔法小写

  

d3395867d05cc4c27f013d6e6f48d644e96d8241

在C#代码中所使用的格式字符串要求大写(“X”相对于“X”):

hex.AppendFormat("{0:X}", b);

也许在网站上的代码是使用区分大小写的比较?我认为这将是微不足道的,为您输出转换从CPAN功能为大写您提交过吗?

莫非如X呼叫改变大写“AppendFormat”为小写“x”?

作为简单

我认为你正在寻找 Digest::SHA1

您SHA-1可能也刚刚被:

BitConverter.ToString(SHA.ComputeHash(buffer)).Replace("-", "");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top