C # в Ruby sha1 base64 кодировать - PullRequest
5 голосов
/ 18 ноября 2010

Я пытаюсь повторить поведение Convert.ToBase64String () в Ruby.

Вот мой код C #:

var sha1 = new SHA1CryptoServiceProvider();
var passwordBytes = Encoding.UTF8.GetBytes("password");
var passwordHash = sha1.ComputeHash(passwordBytes);
return Convert.ToBase64String(passwordHash); // returns "W6ph5Mm5Pz8GgiULbPgzG37mj9g="

Когда я пытаюсь сделать то же самое в Ruby, я получаю другую строку base64 для того же хэша sha1:

require 'digest/sha1'
require 'base64'
sha1 = Digest::SHA1.hexdigest('password')
# sha1 = 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
base64 = Base64.strict_encode64(sha1)
# base64 = "NWJhYTYxZTRjOWI5M2YzZjA2ODIyNTBiNmNmODMzMWI3ZWU2OGZkOA=="

Я подтвердил в отладчике, что байтовый массив C # passwordBytes соответствует значению sha1 в примере Ruby. Есть ли особый способ использования Base64 в Ruby для получения той же строки, что и код C #?

Ответы [ 2 ]

7 голосов
/ 18 ноября 2010

Вы base64-кодируете строку "5baa61...", а не "\x5b\xaa\x61..."

Изменить hexdigest на digest:

sha1 = Digest::SHA1.digest('password')
base64 = Base64.strict_encode64(sha1)
2 голосов
/ 18 ноября 2010

Ваш код C # и Ruby делают немного разные вещи.В вашем C # коде passwordHash - это байт [20].В вашем коде Ruby sha1 содержит строку из 40 символов.Так что вы Base64 кодируете две разные вещи.Отсюда и разные результаты.

...