Я пытаюсь разделить аутентификацию между приложением ASP.NET и другим приложением на основе UNIX, где хешированный пароль хранится в базе данных.Мне нужно убедиться, что алгоритмы хеширования на обеих платформах совпадают.
Вот как я хэширую в C #:
var sha1 = new SHA1CryptoServiceProvider();
var passwordBytes = Encoding.UTF8.GetBytes(password);
var passwordHash = sha1.ComputeHash(passwordBytes);
var base64 = Convert.ToBase64String(passwordHash);
return base64;
Если я использую пароль p@ssw0rd
, хэш равен 57B2AD99044D337197C0C39FD3823568FF81E48A
и base64 этого хэша - V7KtmQRNM3GXwMOf04I1aP+B5Io=
.Хэш base64 - это то, что хранится в БД.
Если я делаю то же самое в UNIX, я получаю совершенно другой хеш:
echo p@ssw0rd | iconv -f ISO-8859-1 -t UTF-8 | shasum -a 1 | base64 -e
производит ZTU3NmQwNmUzMTAwNmRkNzFhNTFjZTg5ZjViMGI4NWM2NTMyNzg3OCAgLQo=
Если вы попробуете это с OpenSSL, используйте этот echo "p@ssw0rd" | openssl dgst -sha1 | openssl enc -base64
, и вы получите тот же хеш.
Чем отличаются два алгоритма SHA1, которые приводят к вычислению разных хешей?Я тоже не солю.
ОБНОВЛЕНИЕ
Секретный соус выглядит следующим образом: echo -n "p@ssw0rd" | openssl dgst -sha1 -binary | openssl enc -base64
echo -n
убирает перевод строки,и -binary
необходимо.
Надеюсь, это кому-нибудь поможет.
Спасибо, Марк