Эквивалент метода SHA1 C # в Perl? - PullRequest
1 голос
/ 05 августа 2009

Мне дали код 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 #.

Код должен использоваться в качестве контрольной суммы для веб-сайта, но тот, который я предоставляю, не работает.

Edit: он также добавляет метку времени UTC (yyyyMMDDHH0000) в конец прохода перед хэшированием, поэтому я добавил этот код на случай, если проблема существует.

Ответы [ 5 ]

5 голосов
/ 05 августа 2009

Я тоже не знаю C #. Однако {0:X} форматирует шестнадцатеричные цифры, используя заглавные буквы. Итак,

my $passSha1 = uc sha1_hex($pass);

помощь? (Предполагая, что GetHashedPassword имеет смысл.)

4 голосов
/ 05 августа 2009

Единственное отличие, которое я вижу (от запуска кода в Visual Studio 2008), заключается в том, что код C # возвращает шестнадцатеричную строку с альфа-кодом в верхнем регистре

D3395867D05CC4C27F013D6E6F48D644E96D8241

и код perl использует строчные буквы для альфа

d3395867d05cc4c27f013d6e6f48d644e96d8241

Строка формата, используемая в коде C #, запрашивает заглавные буквы («X» вместо «x»):

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

Может быть, код на сайте использует сравнение с учетом регистра? Я предполагаю, что для вас будет тривиально преобразовать вывод из функции CPAN в верхний регистр, прежде чем вы отправите его?

2 голосов
/ 05 августа 2009

Может ли это быть так же просто, как смена заглавной буквы 'X' в вызове AppendFormat на строчную 'x'?

0 голосов
/ 29 января 2012

Ваш SHA-1 также мог быть:

BitConverter.ToString(SHA.ComputeHash(buffer)).Replace("-", "");
0 голосов
/ 05 августа 2009

Я думаю, что вы ищете Digest::SHA1

...