it-swarm-vi.com

Mật khẩu trước khi băm trước khi áp dụng bcrypt để tránh hạn chế độ dài mật khẩu

Thực hành tốt là không hạn chế độ dài mật khẩu một cách không cần thiết, do đó có thể sử dụng các mật khẩu dài thích hợp (có thể là 35-45 ký tự cho 6/7 mật khẩu). (Xem ví dụ Tôi có nên có độ dài mật khẩu tối đa không? trong đó đề xuất tối đa 1K, để bảo vệ chống DoS mà không hạn chế khả năng đặt mật khẩu dài của người dùng.)

bcrypt cũng thường được đề xuất (xem ví dụ Có chuyên gia bảo mật nào khuyên dùng bcrypt để lưu trữ mật khẩu không? , http://chargeen.matasano.com/chargeen/2007/9/7/enough- với-the-Rainbow-bảng-what-you-need-to-know-about-s.html )

Bạn cũng nên sử dụng muối (ngẫu nhiên và được lưu trữ bằng hàm băm mật khẩu) - Tôi tin rằng 32-bit (4 ký tự) thường được đề xuất. (Tôi hiểu lý do kích thước muối là "đủ để số lượng kết hợp lớn hơn nhiều so với số lượng hồ sơ người dùng VÀ đủ để làm cho các bảng Rainbow lớn vô cùng" - 16 bit là đủ cho phần thứ hai nhưng có thể không đủ cho người đầu tiên.)

Nhưng bcrypt AIUI chỉ băm 55 byte - với 4 ký tự cho muối để lại 51 cho mật khẩu.

Tôi đoán rằng chúng ta không nên chỉ bcrypt (trái (mật khẩu, 51)) và bỏ qua các ký tự cuối cùng.

Chúng ta có nên chỉ giới hạn người dùng trong 50 ký tự trong mật khẩu của họ (đủ cho gần như tất cả mọi người, nhưng không chắc chắn đủ)?

Thay vào đó, chúng ta có nên sử dụng một cái gì đó như bcrypt (sha256 (salt + password)) và cho phép tối đa 1K ký tự không? Hoặc việc bổ sung bước sha256 (hoặc sha512?) Làm giảm bảo mật tổng thể bằng cách nào đó?

Scrypt hoặc PBKDF2 có hạn chế độ dài tương tự không?

. sử dụng.)

65
Misha

Sử dụng hàm băm an toàn để xử lý trước mật khẩu là an toàn; có thể chỉ ra rằng nếu bcrypt (SHA-256 (mật khẩu)) bị hỏng, thì mật khẩu đã được đoán hoặc một số đặc điểm bảo mật của SHA-256 đã được chứng minh là sai. Không cần phải nghịch ngợm với muối ở cấp độ đó; chỉ cần băm mật khẩu, sau đó sử dụng bcrypt trên kết quả (với muối, như ủy quyền của bcrypt). SHA-256 được coi là một hàm băm an toàn.

Điểm của muối là duy nhất - càng độc đáo càng tốt, sao cho không có hai mật khẩu băm sử dụng cùng một giá trị muối. 32 bit là một chút thấp cho điều đó; bạn nên sử dụng muối lâu hơn. Nếu bạn có n bit muối, thì bạn sẽ gặp phải va chạm (hai mật khẩu được băm sử dụng cùng một loại muối) ngay khi bạn có nhiều hơn khoảng 2n/2 mật khẩu băm - khoảng 65000 với n = 32, giá trị không quá cao. Bạn nên sử dụng 64 bit muối trở lên (sử dụng 128 bit và bạn có thể ngừng lo lắng về nó).

39
Thomas Pornin

Bcrypt sử dụng mật khẩu muối 128 bit VÀ mật khẩu 55 ký tự (tối đa). Bạn không cần thêm bất kỳ giá trị muối nào khác; bcrypt xử lý việc đó.

Các nhà thiết kế của bcrypt cảm thấy rằng giới hạn 55 ký tự cho mật khẩu không phải là vấn đề vì hàm băm có đầu ra 128 bit. Nếu mật khẩu của bạn lớn hơn 55 ký tự, các nhà thiết kế cho rằng bạn đã cung cấp hơn 128 bit entropy nên đây không phải là vấn đề. Ngược lại, các hướng dẫn của NIST sẽ chỉ coi đây là 77 bit của entropy. Các hướng dẫn của NIST dựa trên thực tế là các cụm mật khẩu có ít entropy trên mỗi ký tự hơn mật khẩu ngẫu nhiên và dựa trên giả định rằng người dùng sẽ sử dụng cụm từ cho mật khẩu dài hơn. Để đảm bảo tốt hơn rằng bạn nhận được toàn bộ 128 bit entropy, bạn có thể cho phép mật khẩu dài hơn và băm chúng bằng SHA-256 hoặc SHA-384 để nén chúng đến độ dài chấp nhận được. Bạn cũng có thể đơn giản hóa mọi thứ bằng cách sử dụng scrypt hoặc PBKDF2 không có giới hạn độ dài. Scrypt được thiết kế để "cứng bộ nhớ" ngoài việc tính toán tốn thời gian; đó sẽ là sự lựa chọn của tôi về các thuật toán.

14
Steven Alexander