2010-06-09 5 views
4

저는 BCrypt를 실험 해본 결과 다음을 발견했습니다. 이 중요한 경우에, 나는 처음에는 루비 1.9.2dev (2010-04-30 트렁크 27557)는 i686 - 리눅스]BCrypt는 오랫동안 유사한 암호가 동일하다고 말합니다. 나, 보석 또는 암호화 분야에 문제가 있습니까?

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 ')도 사실로 돌아 오기 시작할 것입니다. 그래서 지금 나는 무엇을 생각해야할지 모른다.

설명은 무엇입니까?

답변

7

좋은 소식은 암호화의 수학적 기초가 해소되지 않은 것입니다. :)

나쁜 소식가 자동으로 실패하는 8-bit key length limit in bcrypt.c가 있다는 것입니다 :

uint8_t key_len, salt_len, logr, minor; 

을 그리고 나중에 :

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

당신이 암호화에 전달하는 것은 263 자이며, 그러나 그것은 단지 8이라고 생각합니다. 따라서 문자열의 맨 처음 부분 만 비교할 수 있습니다.

그러나 long_string의 길이를 줄이면 잘 작동하므로 다른 것과 관련이있을 수있는 255 이하의 범위에서 실제로 문제가 발생하는 경우 문제가 발생합니다.

+2

너무 긴 키가있을 때 bcrypt()가 NULL을 반환하는 문제를 해결할 수있을 것이라고 생각합니다. 또한, 이미 암호 구조에 소금이 있고 bcrypt가 염려스러운 보안 문제를 해결하려고 표면 상으로는 나 자신의 염분에 신경 쓰지 않을 것입니다. – HostileFork

+0

'key_len '이 이런 짧은 타입 인 이유는 충분하지 않습니다. – caf

+1

@caf - 웹에 많은 코드 줄이 있습니다. 그리고 불행히도 그 중 많은 부분이 좋은 이유에 의해 동기 부여를받지 못하는 것 같습니다. :) – HostileFork

5

블로우 피쉬의 P- 어레이는 길이가 4 바이트 정수 18 개입니다. BCrypt는이 배열을 password + null로 XOR 한 다음 끝에 도달 할 때까지 프로 시저를 반복합니다. 패스워드가 12345, 12345 (널) 12345 (널) 12345 (널) 등으로 X- 배열 될 것입니다.

EksBlowfish에 대한 전체 설명은 here입니다. 짧은 버전은 BCrypt 만 첫 72 바이트 만 사용합니다.