Cách băm mật khẩu dài (> 72 ký tự) với Blowfish


91

Tuần trước, tôi đã đọc rất nhiều bài báo về băm mật khẩu và Blowfish có vẻ là (một trong) thuật toán băm tốt nhất hiện nay - nhưng đó không phải là chủ đề của câu hỏi này!

Giới hạn 72 ký tự

Blowfish chỉ xem xét 72 ký tự đầu tiên trong mật khẩu đã nhập:

<?php
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$hash = password_hash($password, PASSWORD_BCRYPT);
var_dump($password);

$input = substr($password, 0, 72);
var_dump($input);

var_dump(password_verify($input, $hash));
?>

Đầu ra là:

string(119) "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)"
string(72) "Wow. This is a super secret and super, super long password. Let's add so"
bool(true)

Như bạn có thể thấy, chỉ 72 ký tự đầu tiên là quan trọng. Twitter đang sử dụng blowfish hay còn gọi là bcrypt để lưu trữ mật khẩu của họ ( https://shouldichangemypassword.com/twitter-hacked.php ) và đoán xem: thay đổi mật khẩu twitter của bạn thành một mật khẩu dài với hơn 72 ký tự và bạn có thể đăng nhập vào tài khoản của mình bằng cách chỉ nhập 72 ký tự đầu tiên.

Blowfish và Pepper

Có rất nhiều ý kiến ​​khác nhau về mật khẩu "peppering". Một số người nói rằng nó không cần thiết, bởi vì bạn phải giả định rằng chuỗi hạt tiêu bí mật cũng được biết đến / được công bố nên nó không tăng cường hàm băm. Tôi có một máy chủ cơ sở dữ liệu riêng nên rất có thể chỉ có cơ sở dữ liệu bị rò rỉ chứ không phải tiêu liên tục.

Trong trường hợp này (tiêu không bị rò rỉ), bạn thực hiện một cuộc tấn công dựa trên từ điển khó khăn hơn (hãy sửa cho tôi nếu điều này không đúng). Nếu chuỗi hạt tiêu của bạn cũng bị rò rỉ: không tệ lắm - bạn vẫn có muối và nó được bảo vệ tốt như băm không có hạt tiêu.

Vì vậy, tôi nghĩ việc dán mật khẩu ít nhất là lựa chọn không tồi.

Gợi ý

Đề xuất của tôi để lấy mã băm Blowfish cho mật khẩu có hơn 72 ký tự (và hạt tiêu) là:

<?php
$pepper = "foIwUVmkKGrGucNJMOkxkvcQ79iPNzP5OKlbIdGPCMTjJcDYnR";

// Generate Hash
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$password_peppered = hash_hmac('sha256', $password, $pepper);
$hash = password_hash($password_peppered, PASSWORD_BCRYPT);

// Check
$input = substr($password, 0, 72);
$input_peppered = hash_hmac('sha256', $input, $pepper);

var_dump(password_verify($input_peppered, $hash));
?>

Điều này dựa trên câu hỏi này : password_verifytrở lại false.

Câu hỏi

Cách an toàn hơn là gì? Nhận hàm băm SHA-256 trước (trả về 64 ký tự) hay chỉ xem xét 72 ký tự đầu tiên của mật khẩu?

Ưu điểm

  • Người dùng không thể đăng nhập bằng cách chỉ nhập 72 ký tự đầu tiên
  • Bạn có thể thêm hạt tiêu mà không vượt quá giới hạn ký tự
  • Đầu ra của hash_hmac có thể sẽ có nhiều entropy hơn chính mật khẩu
  • Mật khẩu được băm bởi hai hàm khác nhau

Nhược điểm

  • Chỉ 64 ký tự được sử dụng để xây dựng hàm băm Blowfish


Chỉnh sửa 1: Câu hỏi này chỉ đề cập đến sự tích hợp PHP của blowfish / bcrypt. Cảm ơn vì những bình luận!


3
Blowfish không phải là người duy nhất cắt bớt mật khẩu, khiến mọi người hiểu nhầm rằng nó an toàn hơn thực tế. Đây là một lịch sử thú vị về giới hạn 8 ký tự.
DOK

2
Việc cắt ngắn 72 ký tự là cơ bản cho thuật toán Blowfish hay chỉ là việc triển khai PHP? IIRC Blowfish cũng được sử dụng trên (ít nhất một số) nixes để mã hóa mật khẩu người dùng.
Douglas B. Staple

3
Vấn đề là với Bcrypt, không phải Blowfish. Tôi có thể tái tạo vấn đề này với Python và Bcrypt một mình.
Máy xay sinh tố

@Blender: Cảm ơn bình luận của bạn và công việc của bạn về nó. Tôi không thể tìm thấy các chức năng khác nhau trong php cho blowfish và bcrypt và mặc dù chúng giống nhau. Nhưng nó không tạo ra sự khác biệt nào cho tôi trong php? Tôi muốn sử dụng hàm php tiêu chuẩn.
Frederik Kammer

1
Cũng xem khung băm mật khẩu PHP của Openwall (PHPass). Tính di động của nó và chống lại một số cuộc tấn công phổ biến vào mật khẩu người dùng. Anh chàng đã viết khuôn khổ (SolarDesigner) cũng chính là người đã viết John The Ripper và là giám khảo trong Cuộc thi Bắn mật khẩu . Vì vậy, anh ta biết một hoặc hai điều về các cuộc tấn công vào mật khẩu.
jww

Câu trả lời:


135

Vấn đề ở đây về cơ bản là vấn đề của entropy. Vì vậy, hãy bắt đầu tìm kiếm ở đó:

Entropy mỗi ký tự

Số bit của entropy trên mỗi byte là:

  • Ký tự Hex
    • Số bit: 4
    • Giá trị: 16
    • Entropy trong 72 ký tự: 288 bit
  • Alpha-Numeric
    • Số bit: 6
    • Giá trị: 62
    • Entropy trong 72 ký tự: 432 bit
  • Ký hiệu "Chung"
    • Số bit: 6,5
    • Giá trị: 94
    • Entropy trong 72 ký tự: 468 bit
  • Byte đầy đủ
    • Số bit: 8
    • Giá trị: 255
    • Entropy trong 72 ký tự: 576 bit

Vì vậy, cách chúng ta hành động phụ thuộc vào kiểu nhân vật mà chúng ta mong đợi.

Vấn đề đầu tiên

Vấn đề đầu tiên với mã của bạn, là bước băm "tiêu" của bạn đang xuất ra các ký tự hex (vì tham số thứ tư đến hash_hmac()không được đặt).

Do đó, bằng cách băm hạt tiêu của bạn vào, bạn đang cắt một cách hiệu quả entropy tối đa có sẵn cho mật khẩu theo hệ số 2 (từ 576 đến 288 bit có thể ).

Vấn đề thứ hai

Tuy nhiên, sha256chỉ cung cấp 256các bit entropy ngay từ đầu. Vì vậy, bạn đang cắt một cách hiệu quả 576 bit có thể xuống 256 bit. Bước băm của bạn * ngay lập tức *, theo định nghĩa sẽ mất ít nhất 50% entropy có thể có trong mật khẩu.

Bạn có thể giải quyết một phần điều này bằng cách chuyển sang SHA512, nơi bạn chỉ giảm entropy có sẵn khoảng 12%. Nhưng đó vẫn là một sự khác biệt không đáng kể. 12% đó làm giảm số hoán vị đi một hệ số 1.8e19. Đó là một con số lớn ... Và đó là yếu tố nó làm giảm nó bằng ...

Vấn đề cơ bản

Vấn đề cơ bản là có ba loại mật khẩu trên 72 ký tự. Tác động của hệ thống phong cách này lên chúng sẽ rất khác nhau:

Lưu ý: từ đây trở đi, tôi giả sử chúng ta đang so sánh với hệ thống tiêu sử dụng SHA512với đầu ra thô (không phải hex).

  • Mật khẩu ngẫu nhiên entropy cao

    Đây là những người dùng của bạn sử dụng trình tạo mật khẩu tạo ra số lượng khóa lớn cho mật khẩu. Chúng là ngẫu nhiên (được tạo ra, không phải do con người chọn) và có entropy cao trên mỗi ký tự. Những loại này đang sử dụng byte cao (ký tự> 127) và một số ký tự điều khiển.

    Đối với nhóm này, hàm băm của bạn sẽ làm giảm đáng kể lượng entropy có sẵn của chúng vào bcrypt.

    Hãy để tôi nói rằng một lần nữa. Đối với những người dùng đang sử dụng mật khẩu dài, entropy cao, giải pháp của bạn làm giảm đáng kể độ mạnh của mật khẩu của họ xuống một lượng có thể đo lường được. (62 bit entropy bị mất đối với mật khẩu 72 ký tự và nhiều hơn nữa đối với mật khẩu dài hơn)

  • Mật khẩu ngẫu nhiên entropy trung bình

    Nhóm này đang sử dụng mật khẩu có chứa các ký hiệu chung, nhưng không có byte cao hoặc ký tự điều khiển. Đây là những mật khẩu có thể đánh máy của bạn.

    Đối với nhóm này, bạn sẽ mở khóa nhiều entropy hơn một chút (không tạo nó, nhưng cho phép nhiều entropy hơn để phù hợp với mật khẩu bcrypt). Khi tôi nói hơi, tôi có nghĩa là hơi. Hòa vốn xảy ra khi bạn sử dụng tối đa 512 bit mà SHA512 có. Do đó, đỉnh cao là 78 ​​ký tự.

    Hãy để tôi nói rằng một lần nữa. Đối với loại mật khẩu này, bạn chỉ có thể lưu trữ thêm 6 ký tự trước khi hết entropy.

  • Mật khẩu không ngẫu nhiên entropy thấp

    Đây là nhóm đang sử dụng các ký tự chữ-số có lẽ không được tạo ngẫu nhiên. Một cái gì đó giống như một trích dẫn kinh thánh hoặc tương tự. Các cụm từ này có khoảng 2,3 bit entropy trên mỗi ký tự.

    Đối với nhóm này, bạn có thể mở khóa nhiều entropy hơn đáng kể (không phải tạo nó, nhưng cho phép nhiều entropy hơn để phù hợp với đầu vào mật khẩu bcrypt) bằng cách băm. Điểm hòa vốn là khoảng 223 ký tự trước khi bạn hết entropy.

    Hãy nói lại điều đó. Đối với loại mật khẩu này, việc băm trước chắc chắn tăng tính bảo mật đáng kể.

Trở lại với thế giới thực

Những loại tính toán entropy này không thực sự quan trọng nhiều trong thế giới thực. Điều quan trọng là đoán entropy. Đó là những gì ảnh hưởng trực tiếp đến những gì kẻ tấn công có thể làm. Đó là những gì bạn muốn tối đa hóa.

Trong khi có rất ít nghiên cứu về việc đoán entropy, có một số điểm mà tôi muốn chỉ ra.

Cơ hội đoán ngẫu nhiên 72 ký tự chính xác liên tiếp là cực kỳ thấp. Bạn có nhiều khả năng trúng xổ số Powerball hơn 21 lần, hơn là để xảy ra vụ va chạm này ... Đó là con số lớn mà chúng ta đang nói đến.

Nhưng chúng ta có thể không vấp phải nó về mặt thống kê. Trong trường hợp các cụm từ, cơ hội của 72 ký tự đầu tiên giống nhau cao hơn rất nhiều so với một mật khẩu ngẫu nhiên. Nhưng nó vẫn rất thấp (nhiều khả năng bạn sẽ thắng xổ số Powerball 5 lần, dựa trên 2,3 bit cho mỗi ký tự).

Thực tế

Thực tế, nó không thực sự quan trọng. Khả năng ai đó đoán đúng 72 ký tự đầu tiên, trong đó những ký tự sau tạo ra sự khác biệt đáng kể là rất thấp nên không đáng lo ngại. Tại sao?

Vâng, giả sử bạn đang sử dụng một cụm từ. Nếu một người có thể viết đúng 72 ký tự đầu tiên, họ thực sự may mắn (không có khả năng xảy ra), hoặc đó là một cụm từ phổ biến. Nếu đó là một cụm từ phổ biến, biến số duy nhất là thời gian tạo ra nó.

Hãy lấy một ví dụ. Hãy trích dẫn từ kinh thánh (chỉ vì đó là một nguồn văn bản dài phổ biến, không phải vì bất kỳ lý do nào khác):

Bạn sẽ không thèm muốn nhà hàng xóm của bạn. Bạn không được thèm muốn vợ của người hàng xóm, người hầu gái hay hầu gái của anh ta, con bò hay con lừa của anh ta, hoặc bất cứ thứ gì thuộc về hàng xóm của bạn.

Đó là 180 ký tự. Ký tự thứ 73 là ký tự gthứ hai neighbor's. Nếu bạn đoán nhiều như vậy, có khả năng bạn sẽ không dừng lại nei, mà tiếp tục với phần còn lại của câu (vì đó là cách mật khẩu có thể được sử dụng). Do đó, "băm" của bạn không thêm nhiều.

BTW: Tôi TUYỆT ĐỐI KHÔNG ủng hộ việc sử dụng trích dẫn kinh thánh. Trong thực tế, hoàn toàn ngược lại.

Phần kết luận

Bạn sẽ không thực sự giúp được nhiều người sử dụng mật khẩu dài bằng cách băm trước. Một số nhóm bạn chắc chắn có thể giúp đỡ. Một số bạn chắc chắn có thể bị thương.

Nhưng cuối cùng, không có điều nào trong số đó là quá đáng kể. Những con số mà chúng tôi đang giải quyết chỉ là CÁCH quá cao. Sự khác biệt về entropy sẽ không nhiều.

Tốt hơn hết bạn nên để nguyên bcrypt. Bạn có nhiều khả năng làm hỏng việc băm (theo nghĩa đen, bạn đã làm điều đó rồi và bạn không phải là người đầu tiên hoặc cuối cùng mắc phải sai lầm đó) hơn là cuộc tấn công mà bạn đang cố gắng ngăn chặn sẽ xảy ra.

Tập trung vào việc bảo mật phần còn lại của trang web. Và thêm một máy đo entropy mật khẩu vào ô mật khẩu khi đăng ký để chỉ ra độ mạnh của mật khẩu (và cho biết nếu mật khẩu quá dài mà người dùng có thể muốn thay đổi nó) ...

Đó là ít nhất 0,02 đô la của tôi (hoặc có thể nhiều hơn 0,02 đô la) ...

Như cách sử dụng hạt tiêu "bí mật":

Thực sự không có nghiên cứu nào về việc đưa một hàm băm vào bcrypt. Do đó, không rõ liệu việc cấp một hàm băm "peppered" vào bcrypt có bao giờ gây ra các lỗ hổng không xác định hay không (chúng tôi biết việc làm này hash1(hash2($value))có thể làm lộ ra các lỗ hổng đáng kể xung quanh khả năng chống va chạm và các cuộc tấn công preimage).

Vì bạn đang cân nhắc việc lưu trữ một khóa bí mật ("hạt tiêu"), tại sao không sử dụng nó theo cách đã được nghiên cứu và hiểu rõ? Tại sao không mã hóa băm trước khi lưu trữ?

Về cơ bản, sau khi bạn băm mật khẩu, hãy cấp toàn bộ đầu ra băm vào một thuật toán mã hóa mạnh. Sau đó lưu trữ kết quả được mã hóa.

Bây giờ, một cuộc tấn công SQL-Injection sẽ không làm rò rỉ bất kỳ thứ gì hữu ích, vì chúng không có khóa mật mã. Và nếu khóa bị rò rỉ, những kẻ tấn công không tốt hơn là nếu bạn sử dụng một hàm băm đơn giản (có thể chứng minh được, thứ gì đó với tiêu "pre-hash" không cung cấp).

Lưu ý: nếu bạn chọn làm điều này, hãy sử dụng thư viện. Đối với PHP, tôi mạnh mẽ khuyên Zend Framework 2 của Zend\Cryptgói. Nó thực sự là người duy nhất tôi muốn giới thiệu vào thời điểm hiện tại. Nó đã được xem xét kỹ lưỡng và đưa ra tất cả các quyết định cho bạn (đó là một điều rất tốt) ...

Cái gì đó như:

use Zend\Crypt\BlockCipher;

public function createHash($password) {
    $hash = password_hash($password, PASSWORD_BCRYPT, ["cost"=>$this->cost]);

    $blockCipher = BlockCipher::factory('mcrypt', array('algo' => 'aes'));
    $blockCipher->setKey($this->key);
    return $blockCipher->encrypt($hash);
}

public function verifyHash($password, $hash) {
    $blockCipher = BlockCipher::factory('mcrypt', array('algo' => 'aes'));
    $blockCipher->setKey($this->key);
    $hash = $blockCipher->decrypt($hash);

    return password_verify($password, $hash);
}

Và nó có lợi vì bạn đang sử dụng tất cả các thuật toán theo những cách được hiểu rõ và nghiên cứu kỹ lưỡng (ít nhất là tương đối). Nhớ lại:

Bất cứ ai, từ những người nghiệp dư khó hiểu nhất đến những nhà mật mã giỏi nhất, đều có thể tạo ra một thuật toán mà bản thân anh ta không thể phá vỡ.


6
Cảm ơn bạn rất nhiều vì câu trả lời chi tiết này. Điều này thực sự giúp tôi!
Frederik Kammer

1
Lời khen của tôi cho câu trả lời này. Tuy nhiên, có một điều đáng chú ý nhỏ, đó là phần lớn người dùng, sử dụng mật khẩu, từ và dẫn xuất rất yếu trong từ điển để bẻ khóa mật khẩu, một tiêu sẽ bảo vệ họ độc lập với các câu hỏi liên quan. Để tránh mất entrophy, bạn có thể ghép mật khẩu và tiêu. Tuy nhiên, đề xuất của bạn về việc mã hóa giá trị băm có lẽ là giải pháp tốt nhất để thêm bí mật phía máy chủ.
martinstoeckli

2
@martinstoeckli: Vấn đề của tôi với khái niệm hạt tiêu không nằm ở giá trị của nó. Đó là ở chỗ ứng dụng của "hạt tiêu" đi vào lãnh thổ chưa được khám phá về các thuật toán mật mã. Đó không phải là một điều tốt. Thay vào đó, tôi tin rằng các nguyên thủy mật mã nên được kết hợp theo cách mà chúng được thiết kế để đi cùng nhau. Về cơ bản, khái niệm cốt lõi của một hạt tiêu nghe trong tai tôi giống như một số người không biết gì về mật mã đã nói rằng "Càng nhiều băm càng tốt! Chúng ta có muối, hạt tiêu cũng tốt!" . Tôi chỉ muốn có một
cấy ghép

@ircmaxell - Vâng, tôi biết quan điểm của bạn và tôi đồng ý, miễn là các giá trị băm sẽ được mã hóa sau đó. Nếu bạn không thực hiện bước bổ sung này, một cuộc tấn công từ điển sẽ chỉ đơn giản là tiết lộ quá nhiều mật khẩu yếu, ngay cả với một thuật toán băm tốt.
martinstoeckli

@martinstoeckli: Tôi không đồng ý ở đó. Lưu trữ bí mật không phải là một việc tầm thường. Thay vào đó, nếu bạn sử dụng bcrypt với chi phí tốt (12 ngày nay), tất cả trừ loại mật khẩu yếu nhất đều an toàn (từ điển và mật khẩu tầm thường là những mật khẩu yếu). Vì vậy, tôi muốn khuyên mọi người nên tập trung vào việc giáo dục người dùng bằng các đồng hồ đo sức mạnh và khiến họ sử dụng mật khẩu tốt hơn ngay từ đầu ...
ircmaxell

5

Mật khẩu ngang hàng chắc chắn là điều nên làm, nhưng hãy xem tại sao.

Trước tiên, chúng ta nên trả lời câu hỏi khi nào thì hạt tiêu có tác dụng. Pepper chỉ bảo vệ các mật khẩu, miễn là nó được giữ bí mật, vì vậy nếu kẻ tấn công có quyền truy cập vào chính máy chủ, nó sẽ không có ích lợi gì. Mặc dù vậy, một cuộc tấn công dễ dàng hơn nhiều là SQL-injection, cho phép truy cập đọc vào cơ sở dữ liệu (tới các giá trị băm của chúng tôi), tôi đã chuẩn bị một bản demo về SQL-injection để cho thấy nó có thể dễ dàng như thế nào (nhấp vào mũi tên tiếp theo để chuẩn bị đầu vào).

Vậy thì hạt tiêu thực sự giúp được gì? Miễn là Pepper vẫn giữ bí mật, nó sẽ bảo vệ các mật khẩu yếu khỏi cuộc tấn công từ điển. Mật khẩu 1234sau đó sẽ trở thành một cái gì đó như thế nào 1234-p*deDIUZeRweretWy+.O. Mật khẩu này không chỉ dài hơn mà còn chứa các ký tự đặc biệt và sẽ không bao giờ là một phần của bất kỳ từ điển nào.

Bây giờ chúng tôi có thể ước tính mật khẩu mà người dùng của chúng tôi sẽ sử dụng, có lẽ nhiều người dùng sẽ nhập mật khẩu yếu hơn, vì có những người dùng có mật khẩu từ 64-72 ký tự (thực sự điều này sẽ rất hiếm).

Một điểm khác là phạm vi cho hành vi cưỡng bức. Hàm băm sha256 sẽ trả về đầu ra 256 bit hoặc kết hợp 1,2E77, đó là quá nhiều cho việc ép buộc, ngay cả đối với GPU (nếu tôi tính toán chính xác, điều này sẽ cần khoảng 2E61 năm trên GPU vào năm 2013). Vì vậy, chúng tôi không gặp bất lợi thực sự khi áp dụng tiêu. Bởi vì các giá trị băm không có hệ thống, bạn không thể tăng tốc độ ép buộc bằng các mẫu phổ biến.

PS Theo như tôi biết, giới hạn 72 ký tự dành riêng cho thuật toán của BCrypt. Câu trả lời tốt nhất tôi tìm thấy là điều này .

PPS Tôi nghĩ rằng ví dụ của bạn là thiếu sót, bạn không thể tạo mã băm với độ dài mật khẩu đầy đủ và xác minh nó bằng một mã bị cắt ngắn. Có thể bạn muốn áp dụng tiêu theo cùng một cách để tạo hàm băm và xác minh hàm băm.


Về PPS của bạn, tôi chỉ có thể nói: Có, anh ấy có thể xác minh mật khẩu bị cắt ngắn bằng băm của mật khẩu không bị cắt ngắn và vẫn nhận được true. Đó là những gì câu hỏi này là về tất cả. Hãy tự xem: viper-7.com/RLKFnB
Sliq

@Panique - Vấn đề không nằm ở việc tính toán băm BCrypt, mà là HMAC trước đây. Để tạo hàm băm SHA, OP sử dụng mật khẩu có độ dài đầy đủ và sử dụng kết quả làm đầu vào cho BCrypt. Để xác minh, anh ta cắt bớt mật khẩu trước khi tính toán băm SHA, sau đó sử dụng kết quả hoàn toàn khác này làm đầu vào cho BCrypt. HMAC chấp nhận đầu vào có độ dài bất kỳ.
martinstoeckli

2

Bcrypt sử dụng một thuật toán dựa trên thuật toán thiết lập khóa Blowfish đắt tiền.

Giới hạn mật khẩu 56 byte được đề xuất (bao gồm byte kết thúc rỗng) cho bcrypt liên quan đến giới hạn 448 bit của khóa Blowfish. Bất kỳ byte nào vượt quá giới hạn đó sẽ không được trộn hoàn toàn vào hàm băm kết quả. Do đó, giới hạn tuyệt đối 72 byte đối với mật khẩu bcrypt ít liên quan hơn, khi bạn xem xét ảnh hưởng thực tế đối với kết quả băm theo các byte đó.

Nếu bạn nghĩ rằng người dùng của mình thường chọn mật khẩu có độ dài trên 55 byte, hãy nhớ rằng bạn luôn có thể tăng số lần kéo dài mật khẩu để tăng cường bảo mật trong trường hợp vi phạm bảng mật khẩu (mặc dù điều này phải rất nhiều so với việc thêm nhân vật). Nếu quyền truy cập của người dùng là quan trọng đến mức người dùng thường yêu cầu một mật khẩu dài, thì thời hạn sử dụng mật khẩu cũng phải ngắn, chẳng hạn như 2 tuần. Điều này có nghĩa là mật khẩu ít có khả năng vẫn còn giá trị hơn nhiều trong khi hacker đầu tư tài nguyên của họ để đánh bại yếu tố công việc liên quan đến việc kiểm tra từng mật khẩu dùng thử để xem liệu nó có tạo ra một hàm băm phù hợp hay không.

Tất nhiên, trong trường hợp bảng mật khẩu không bị xâm phạm, chúng ta chỉ nên cho phép tin tặc, tối đa là mười lần thử đoán mật khẩu 55 byte của người dùng, trước khi khóa tài khoản của người dùng;)

Nếu bạn quyết định băm trước một mật khẩu dài hơn 55 byte, thì bạn nên sử dụng SHA-384, vì nó có đầu ra lớn nhất mà không vượt quá giới hạn.


1
"thời hạn sử dụng mật khẩu cũng phải ngắn, như 2 tuần" của "mật khẩu dài hàng loạt", thực sự, tại sao lại bận tâm đến việc lưu mật khẩu sau đó, chỉ cần sử dụng đặt lại mật khẩu mỗi lần. Nghiêm túc mà nói, đó là giải pháp sai lầm, hãy chuyển sang xác thực hai yếu tố bằng mã thông báo.
zaph

Cảm ơn @zaph. Bạn có thể chỉ cho tôi một ví dụ về điều đó không? Nghe thú vị.
Phil

[DRAFT NIST Special Publication 800-63B Digital Authentication Guideline] ( pages.nist.gov/800-63-3/sp800-63b.html ), 5.1.1.2. Người xác minh bí mật đã ghi nhớ : Người xác minh KHÔNG NÊN yêu cầu thay đổi bí mật đã ghi nhớ một cách tùy tiện (ví dụ: định kỳ) . Cũng xem Hướng tới Yêu cầu Mật khẩu Tốt hơn của Jim Fenton.
zaph

1
Vấn đề là người dùng càng thường xuyên bị yêu cầu thay đổi mật khẩu thì điều tồi tệ nhất là lựa chọn mật khẩu trở nên giảm tính bảo mật. Người dùng có một số lượng hạn chế mật khẩu tốt có thể ghi nhớ và chúng hết sạch, hoặc chọn mật khẩu thực sự xấu hoặc viết chúng trên ghi chú post-it bị kẹt ở cuối bàn phím, v.v.
zaph 22/02
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.