2011-08-16 30 views
14

thế nào là bcrypt mạnh hơn, chẳng hạn,Sự khác biệt giữa bcrypt và băm nhiều lần là gì?

def md5lots(password, salt, rounds): 
    if (rounds < 1) 
     return password 
    else 
     newpass = md5(password + salt) 
     return md5lots(newpass, salt, rounds-1) 

tôi nhận được cảm giác, được đưa ra quảng cáo thổi phồng của nó, mà người thông minh hơn tôi đã tìm ra rằng bcrypt là tốt hơn thế này. Ai đó có thể giải thích sự khác biệt trong thuật ngữ 'giáo dân thông minh'?

+1

Số lượng vòng trong bcrypt là '2^i' do đó nó là tăng trưởng theo hàm mũ, nhưng, câu hỏi rất hay ... trên một lưu ý có liên quan sẽ rất thú vị khi so sánh bcrypt với băm HMAC về" bổ sung cứng lại ". –

Trả lời

3

Có ba khác biệt đáng kể giữa bcrypt và băm nhiều lần với MD5:

  1. Kích thước của đầu ra: 128-bit (16-byte) cho MD5 và 448 bit (56 byte) cho bcrypt. Nếu bạn lưu trữ hàng triệu băm trong cơ sở dữ liệu, điều này phải được tính đến.
  2. Va chạm và các cuộc tấn công có thể xảy ra đối với MD5.
  3. Bcrypt có thể được cấu hình để lặp đi lặp lại nhiều hơn và nhiều hơn nữa khi CPU ngày càng trở nên mạnh mẽ hơn.

Do đó, việc sử dụng tính năng salting-and-stretching với MD5 không an toàn như sử dụng bcrypt. Vấn đề này có thể được giải quyết bằng cách chọn hàm băm tốt hơn MD5.

Ví dụ, nếu SHA-256 được chọn, kích cỡ đầu ra sẽ là 256 bit (32 byte). Nếu quá trình ướp muối và kéo dài có thể được cấu hình để tăng số lần lặp lại như bcrypt, thì không có sự khác biệt giữa cả hai phương thức, ngoại trừ lượng không gian cần thiết để lưu trữ các băm kết quả.

+0

Nếu bạn có mật khẩu được băm trước (hệ số công việc 12) với bcrypt và bạn tăng hệ số công việc lên 14, bạn có phải đặt lại mật khẩu không? hoặc có thể bcrypt tái băm một mật khẩu băm cho các yếu tố làm việc được biết đến –

+0

OK, quên MD5, đó không phải là điểm của câu hỏi của tôi. Giả sử một băm tùy ý trong chương trình mẫu của tôi miễn là đầu ra của bcrypt. Điểm 1 bị loại bỏ. Điểm 3 cũng bị loại bỏ, vì mẫu của tôi ở trên chỉ giải quyết được điều đó (lặp lại băm đến thời gian CPU lenghen). Điểm 2 vẫn còn: Giả sử một băm tốt hơn, điều gì làm cho bcrypt tốt hơn? –

+0

@luke Không có gì nếu bạn có thể định cấu hình số lần lặp lại của việc làm mặn và kéo dài – JVerstry

1

Bạn đang nói một cách hiệu quả về việc triển khai PBKDF2 hoặc Chức năng dẫn xuất khóa dựa trên mật khẩu. Có hiệu quả nó giống như BCrypt, lợi thế là bạn có thể kéo dài thời gian CPU cần để lấy được mật khẩu. Lợi thế của điều này trên BCrypt là, bằng cách biết có bao nhiêu 'Iterations' bạn đã đặt mật khẩu, khi bạn cần tăng nó, bạn có thể làm điều đó mà không cần đặt lại tất cả các mật khẩu trong cơ sở dữ liệu. Chỉ cần có thuật toán của bạn nhận kết quả cuối cùng như thể nó đang ở lần lặp thứ n (trong đó n là số đếm ngược trước đó) và tiếp tục đi! Bạn nên sử dụng một thư viện PBKDF2 thích hợp thay vì tạo ra thư viện của riêng bạn, bởi vì cho phép đối mặt với nó, như với tất cả các mật mã, cách duy nhất bạn biết nếu một cái gì đó an toàn là nếu nó đã được 'kiểm tra' bởi các interwebs. (Xem here)

Các hệ thống sử dụng phương pháp này:
NET có một thư viện đã thực hiện. Xem nó here
Mã hóa tệp Mac, Linux và cửa sổ sử dụng nhiều phiên bản itteration (10.000+) của phương pháp mã hóa này để bảo mật hệ thống tệp của họ.
mạng Wi-Fi thường được bảo đảm sử dụng phương pháp mã hóa này
Source

Cám ơn đặt ra câu hỏi, nó buộc tôi phải nghiên cứu các phương pháp tôi đã được sử dụng cho việc bảo vệ mật khẩu của tôi.

TTD

4

Sự khác biệt chính - MD5 và các hàm băm khác được thiết kế để xác minh dữ liệu đã được thiết kế để nhanh và bcrypt() đã được thiết kế chậm.

Khi bạn xác minh dữ liệu, bạn muốn tốc độ, bởi vì bạn muốn xác minh dữ liệu nhanh nhất có thể.

Khi bạn đang cố gắng bảo vệ bằng chứng xác thực, tốc độ hoạt động với bạn. Một kẻ tấn công với một bản sao của một băm mật khẩu sẽ có thể thực hiện nhiều cuộc tấn công brute force hơn vì MD5 và SHA1, vv, là giá rẻ để thực thi.

bcrypt ngược lại là cố tình tốn kém. Điều này rất ít khi có một hoặc hai lần cố gắng xác thực bởi người dùng chính hãng, nhưng là nhiều hơn tốn kém hơn cho sức mạnh vũ phu.

0

Nói đúng ra, bcrypt thực sự mã hóa văn bản:

OrpheanBeholderScryDoubt

64 lần.

Nhưng nó thực hiện bằng khóa có nguồn gốc từ mật khẩu của bạn và một số muối được tạo ngẫu nhiên.

1

Mặc dù câu hỏi này đã được trả lời, tôi muốn chỉ ra một sự khác biệt tinh tế giữa BCrypt và vòng băm của bạn. Tôi sẽ bỏ qua thuật toán MD5 không được chấp nhận và yếu tố chi phí theo cấp số nhân, bởi vì bạn có thể dễ dàng cải thiện điều này trong câu hỏi của mình.

Bạn đang tính giá trị băm và sau đó bạn sử dụng kết quả để tính giá trị băm tiếp theo. Nếu bạn nhìn vào việc thực hiện BCrypt, bạn có thể thấy, mỗi lần lặp lại sử dụng giá trị băm kết quả, cũng như mật khẩu ban đầu (khóa).

Eksblowfish(cost, salt, key) 
    state = InitState() 
    state = ExpandKey(state, salt, key) 
    repeat (2^cost) 
    state = ExpandKey(state, 0, key) 
    state = ExpandKey(state, 0, salt) 
    return state 

Đây là lý do, bạn không thể lấy mật khẩu băm được mã hóa và tiếp tục lặp lại vì bạn sẽ phải biết mật khẩu ban đầu. Tôi không thể chứng minh nó, nhưng tôi cho rằng điều này làm cho Bcrypt an toàn hơn một vòng lặp băm đơn giản.

Các vấn đề liên quan