BCRYPT говорит длинные, похожие пароли эквивалентны - проблема со мной, драгоценным камнем или областью криптографии?

StackOverflow https://stackoverflow.com/questions/3002828

Вопрос

Я экспериментировал с BCRYPT и нашел следующее. Если это важно, я работаю Ruby 1.9.2dev (на 2010-04-30 ствол 27557) [I686-Linux

require 'bcrypt' # bcrypt-ruby gem, version 2.1.2

@long_string_1 = 'f287ed6548e91475d06688b481ae8612fa060b2d402fdde8f79b7d0181d6a27d8feede46b833ecd9633b10824259ebac13b077efb7c24563fce0000670834215'
@long_string_2 = 'f6ebeea9b99bcae4340670360674482773a12fd5ef5e94c7db0a42800813d2587063b70660294736fded10217d80ce7d3b27c568a1237e2ca1fecbf40be5eab8'

def salted(string)
  @long_string_1 + string + @long_string_2
end

encrypted_password = BCrypt::Password.create(salted('password'), :cost => 10)
puts encrypted_password #=> $2a$10$kNMF/ku6VEAfLFEZKJ.ZC.zcMYUzvOQ6Dzi6ZX1UIVPUh5zr53yEu

password = BCrypt::Password.new(encrypted_password)

puts password.is_password?(salted('password')) #=> true
puts password.is_password?(salted('passward')) #=> true
puts password.is_password?(salted('75747373')) #=> true
puts password.is_password?(salted('passwor')) #=> false

Сначала я подумал, что после того, как пароли добрались до определенной длины, различия могут быть потеряны во все хеширование, и только если они были очень разнородными (т. Е. Другой длиной), будут ли они распознаны как разные. Это не казалось очень правдоподобным для меня, от того, что я знаю из хеш-функций, но я не видел лучшего объяснения.

Затем я попытался сократить каждый из Long_Strings, чтобы увидеть, где Bcrypt начнет быть в состоянии сказать им отдельно, и я обнаружил, что если я уконул каждую из длинных струн до 100 символов или около того, окончательная попытка («Passwor») начнется Возвращение истина. Так что теперь я не знаю, что думать.

Что такое объяснение для этого?

Это было полезно?

Решение

То хорошие новости Таким образом, математические основы шифрования не были растворены. :)

То плохие новости это то, что есть 8-битный предел длины ключа в bcrypt.c который молча не проходит:

uint8_t key_len, salt_len, logr, minor;

Тогда позже:

key_len = strlen(key) + (minor >= 'a' ? 1 : 0);

То, что вы проходите для шифрования, - 263 символа, но он думает, что это всего 8. Так что вы получаете сравнения только на самую первую часть строк.

Тем не менее, это работает нормально для меня, когда я паре вниз по длине long_stringS, так что если вы на самом деле получаете проблему в общем диапазоне суб-255, которые могут быть связаны с чем-то еще.

Другие советы

P-Array Blowfish - 18 4-байтовых целых чисел. BCRYPT XOS Этот массив паролем + NULL, затем повторяет процедуру, пока она не дойдет до конца. Скажем, мой пароль был 12345, он бы XOR P-Array на 12345 (NULL) 12345 (NULL) 12345 (NULL) и т. Д.

Полное описание Eksblowfish здесь. Отказ Короткие версии, BCRYPT использует только первые 72 байта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top