Можно ли сгенерировать более длинное хеш-значение с помощью строки # crypt? - PullRequest
2 голосов
/ 04 августа 2009

У меня два коротких вопроса о методе Руби String#crypt(salt):

  1. В документации сказано, что соль должна состоять из двух символов. Я думал, что соль может быть чем угодно, нет? Я использую случайное значение, которое больше двух символов, и, кажется, работает нормально. Это ошибка в документации или в моем понимании того, как это работает?
  2. В настоящее время генерируется строка длиной ~ 15 символов. Я хотел бы создать что-то более длинное, по крайней мере, 32 символа. Есть ли способ сделать это с помощью встроенной функциональности Ruby? Если нет, то какой гем или плагин рекомендуется использовать для простого генерирования более длинного хеша с заданной строкой?

Ответы [ 3 ]

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

Согласно "Криптографическим правильным ответам (которые я советую читать и слушать, если вы действительно не знаете, что делаете ... и почти никто не знает), SHA1 слишком" не работает для производственного кода. Используйте SHA256:

require 'digest/sha2'
Digest::SHA2.hexdigest("foobar" + "abc") # => "32ef4da9bcfbbe1..." (64 chars)
Digest::SHA2.hexdigest("foobar" + "abd") # => "f5e363e77f14e07..." (64 chars)

или SHA512:

require 'digest/sha2'
digest = Digest::SHA2.new(512)
digest << 'foobar'
digest << 'abc'
digest.to_s                              # => ""415d4ca2647d17..." (128 chars)

digest.reset
digest << 'foobar'
digest << 'abd'
digest.to_s                              # => ""93fbbe3b6a7aac..." (128 chars)
2 голосов
/ 05 августа 2009

Я бы использовал bcrypt-ruby . Bcrypt является более безопасным алгоритмом хеширования, так как он разработан, чтобы быть вычислительно дорогим и, следовательно, медленным, тогда как варианты Sha ​​намного быстрее. Это делает грубое принуждение еще более трудным.

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

String#crypt игнорирует любые дополнительные символы, поэтому используются только первые два.

"foobar".crypt("abc") # => abVbJXzHUY99s
"foobar".crypt("abd") # => abVbJXzHUY99s

Вместо этого вы можете использовать SHA1, чтобы предоставить вам 40-символьное шифрование и разрешить любую длину соли.

require 'digest/sha1'
Digest::SHA1.hexdigest("foobar" + "abc") # => 17dd6cae99582672c4b2ccc78fe4ad0888559ce7
Digest::SHA1.hexdigest("foobar" + "abd") # => 8aba27fd409286946504ac78098c41549d182316

ОБНОВЛЕНИЕ : как отметил Гай, SHA1 не лучший для производства. Вместо этого используйте SHA256 или SHA512. Подробности смотрите в его ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...