Điểm:3

Đây có được coi là một hàm băm mật khẩu an toàn không?

lá cờ ng

Tôi nghĩ rằng tôi đã hiểu đúng, nhưng tôi muốn chắc chắn rằng điều này sẽ liên quan đến tiền bạc.

  1. Yêu cầu mật khẩu tối thiểu là 16 ký tự và phải chứa một trong mỗi [Upper, Lower, Digit, Other]
  2. Muối của tôi là Crypto RNG được tạo 64 byte
  3. Tôi chuyển đổi muối thành Base64 (không có dấu ==)
  4. Sau đó, tôi nhận được các byte ghép nối UTF8 (SaltString + Mật khẩu)
  5. Sau đó, tôi SHA512 các byte đó trong một vòng lặp 100 nghìn lần
byte tĩnh riêng tư [] Cụm mật khẩu muối (byte [] muối, mật khẩu chuỗi)
{
    var sha512 = SHA512.Tạo();
    // Muối dưới dạng chuỗi Base64 (không có == ở cuối) theo sau là mật khẩu
    đầu vào chuỗi = $"{Convert.ToBase64String(salt)[0..^2]}{password}";
    byte[] byte = sha512.ComputeHash(Encoding.UTF8.GetBytes(input));
    cho (int i = 0; i < 100_000; i++)
        byte = sha512.ComputeHash(byte);
    trả về byte;
}

CHỈNH SỬA Cảm ơn tất cả mọi người vì lời giải thích chi tiết và nhận xét hữu ích của bạn!

lá cờ jp
Bạn đang quá chú trọng vào muối -- tất cả những gì nó thực sự cần là duy nhất, vì vậy kẻ tấn công không thể thực hiện các cuộc tấn công song song đối với nhiều tài khoản có cùng một loại muối. Ngoài ra là quá mức cần thiết.
lá cờ hm
Đồng ý rằng muối lớn hơn mức cần thiết - nhưng muối không chỉ chống lại tính toán song song mà còn chống lại tính toán * trước *. Vì vậy, chúng không chỉ cần phải là duy nhất trong phạm vi của danh sách băm/nền tảng mục tiêu, mà còn thực tế là duy nhất *trên toàn cầu* - đủ để khiến việc tính toán trước và sau đó lưu trữ chúng là không khả thi. Ví dụ: bcrypt và scrypt sử dụng muối 128 bit (16 byte) - vẫn nhỏ hơn 64 byte một chút, nhưng đủ để tạo danh sách tất cả các giá trị phần lớn là không khả thi.
marcelm avatar
lá cờ cn
**[Không tạo chức năng băm mật khẩu của riêng bạn](https://security.stackexchange.com/a/31846/99775), dừng hoàn toàn.**
Persistence avatar
lá cờ br
@marcelm - Nếu mọi người làm theo lời khuyên đó, chúng tôi sẽ không có chức năng băm mật khẩu... Có thể nói rằng "trừ khi bạn là chuyên gia về mật mã"
marcelm avatar
lá cờ cn
@Persistence Không, bởi vì mọi người có xu hướng nghĩ rằng họ là chuyên gia trong lĩnh vực mà họ không phải là chuyên gia. Nhận xét này được đưa ra trong bối cảnh có vô số câu hỏi của SE về tiền điện tử hobe-brew và câu trả lời luôn là: _không_. Dù sao thì những nhà mật mã thực sự làm việc này một cách chuyên nghiệp sẽ không bị ngăn cản bởi một nhận xét trên crypto.SE.
Persistence avatar
lá cờ br
Bạn có lý... Hiệu ứng Dunning Kreuger rất mạnh
Seth R avatar
lá cờ in
Các chuyên gia @Persistence về mật mã không tìm kiếm lời khuyên trên Stack Exchange. Nếu bạn đang đọc điều này, bạn không nên tạo các hàm băm.
Persistence avatar
lá cờ br
@SethR - Điều đó không nhất thiết phải đúng ... Tôi vừa là một kỹ sư điện tử và phần mềm chuyên nghiệp, vừa là một kỹ sư sau đại học.Tôi vẫn sử dụng Stack Overflow và Electronics SE vì các chuyên gia khác cũng sử dụng nó và không ai, kể cả chuyên gia, có thể biết mọi thứ.
Peter Morris avatar
lá cờ ng
Tôi không tạo hàm băm tiền điện tử, tôi sử dụng những hàm hiện có.
marcelm avatar
lá cờ cn
@PeterMorris Không, bạn đã tạo chức năng băm mật khẩu của riêng mình. Việc bạn đã sử dụng SHA512 làm nguyên hàm trong hàm của mình là không liên quan. Khá dễ dàng để tạo một thuật toán không an toàn bằng cách sử dụng các khối xây dựng an toàn. [AES-ECB](https://crypto.stackexchange.com/a/20946/32547) sẽ là một ví dụ nổi tiếng về điều đó. Rất khó để hiểu đúng về mật mã, đó là lý do tại sao những người biết họ đang làm gì chỉ sử dụng các thuật toán đã được kiểm duyệt kỹ lưỡng và đứng vững trước sự giám sát của công chúng. Việc sử dụng tiền điện tử của riêng bạn sẽ mở ra cho bạn những rủi ro lớn hơn nhiều so với việc sử dụng các thuật toán nổi tiếng.
Peter Morris avatar
lá cờ ng
@marcelm À tôi hiểu rồi, cảm ơn vì thông tin đó, tôi đánh giá cao nó!
lá cờ in
"và phải chứa một trong mỗi [Upper, Lower, Digit, Other]" -> Tôi thường để trình quản lý mật khẩu của mình tạo một mật khẩu ngẫu nhiên cho mỗi trang web nhưng đối với các trang web buộc tôi phải sử dụng một số ký tự đặc biệt, về cơ bản tôi có một mật khẩu duy nhất chỉ bao gồm các ký tự đặc biệt. Đó thường là những trang web không quan trọng.
marcelm avatar
lá cờ cn
@PeterMorris Không vấn đề gì! Tôi cũng phát hiện ra một lỗi thú vị trong thuật toán của bạn. Tất cả điều này đang trở nên quá nhiều đối với các bình luận nên tôi đã viết một câu trả lời.
Wernfried Domscheit avatar
lá cờ za
Tại sao bạn lại cắt `==` khỏi muối của mình?
Wernfried Domscheit avatar
lá cờ za
Ngoài tất cả lý thuyết được đưa ra trong các câu trả lời khác nhau: Ít nhất một số người nghĩ rằng, việc phát triển thuật toán băm rất dễ dàng. Nhưng hãy xem có bao nhiêu hoặc tốt hơn là có bao nhiêu [thuật toán băm mật khẩu](https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms) thực sự khả dụng, đây có vẻ là một công việc khó khăn và chỉ có một số chuyên gia trên thế giới thực hiện được. có khả năng phát triển chúng.Việc phát triển [ngôn ngữ lập trình](https://en.wikipedia.org/wiki/List_of_programming_languages) có vẻ dễ dàng hơn nhiều
Điểm:32
lá cờ in

Ngoại trừ số lần lặp lại (chúng ta cũng có thể tranh luận rằng nó cũng nhỏ â¡ và một số tổn thất entropy *), câu trả lời là không!

  • Không có độ cứng bộ nhớ điều đó chủ yếu ngăn chặn các tìm kiếm ASIC/GPU lớn
  • Không có nhiều luồng chủ yếu làm tê liệt các tìm kiếm CPU lớn.

Hiện đã có các thuật toán băm mật khẩu khác với các thuật toán băm mật mã như sê-ri SHAx. Một số quan trọng là Tiền Mã Hóa (2009), PBKDF2 (2000), Argon2 (2015), và Bong Bóng Băm (2016). Argon2 là người chiến thắng cuộc thi băm mật khẩu được tổ chức vào năm 2015. Giờ đây, Balloon Hashing có thể chiến đấu với Argon2. Sử dụng Balloon Hashing hoặc Argon2 để băm mật khẩu an toàn.

Đã có các thư viện cho từng thư viện mà bạn chỉ cần tham số hóa như cho Argon2 thay vì tự viết chi tiết.

Một thư viện Argon2 tốt

Đây là các thông số;

Cách sử dụng: ./argon2 [-h] muối [-i|-d|-id] [-t lần lặp] [-m bộ nhớ] [-p song song] [-l độ dài hàm băm] [-e|-r] [- v(10|13)]
        Mật khẩu được đọc từ stdin
Thông số:
        salt Loại muối sử dụng, ít nhất 8 ký tự
        -i Sử dụng Argon2i (đây là mặc định)
        -d Sử dụng Argon2d thay vì Argon2i
        -id Sử dụng Argon2id thay vì Argon2i
        -t N Đặt số lần lặp lại thành N (mặc định = 3)
        -m N Đặt mức sử dụng bộ nhớ là 2^N KiB (mặc định 12)
        -p N Đặt tính song song cho N luồng (mặc định 1)
        -l N Đặt độ dài đầu ra hàm băm thành N byte (mặc định 32)
        -e Hàm băm chỉ được mã hóa đầu ra
        -r Chỉ xuất ra các byte thô của hàm băm
        -v (10|13) Phiên bản Argon2 (mặc định là phiên bản mới nhất, hiện tại là 13)

        -h In sử dụng argon2

tôi có thể hỏi cái gì là $i,d,$$id$ trong Argon2. Câu trả lời là từ dự thảo-irtf-cfrg-argon2-03;

Nếu bạn không biết sự khác biệt giữa chúng hoặc bạn coi các cuộc tấn công kênh bên là mối đe dọa khả thi, chọn Argon2id.

  • Argon2d nhanh hơn và sử dụng quyền truy cập bộ nhớ phụ thuộc vào dữ liệu. Sự phụ thuộc dữ liệu ngay lập tức kích hoạt kênh phụ. Điều này phù hợp với tiền điện tử và các ứng dụng không có mối đe dọa từ các cuộc tấn công kênh phụ.

  • Argon2i sử dụng quyền truy cập bộ nhớ độc lập với dữ liệu và điều này được ưu tiên cho việc băm mật khẩu và dẫn xuất khóa dựa trên mật khẩu.

  • Argon2id Trong nửa đầu của lần lặp đầu tiên hoạt động như Argon2i và phần còn lại hoạt động như Argon2d. Điều này cho phép bảo vệ cả kênh phụ và đánh đổi bộ nhớ thời gian.

Băm bong bóng

Bây giờ, nó ở trong Ấn phẩm đặc biệt của NIST 800-63B và nó cần một thời gian để thích nghi. Có một số thư viện đã sẵn sàng để sử dụng.

Các thuộc tính chính là;

  • Độ cứng của bộ nhớ đã được chứng minh
  • Nó được thiết kế trên các nguyên mẫu tiêu chuẩn: nó có thể sử dụng bất kỳ hàm băm mật mã cứng không có bộ nhớ nào như SHA2, SHA3 và BLAKE2.
  • Nó có khả năng chống lại các cuộc tấn công kênh bên tích hợp sẵn yêu cầu mẫu truy cập bộ nhớ độc lập với các bit của dữ liệu được băm.

Ít về mật khẩu

Đối với mật khẩu của người dùng, bạn nên hướng dẫn họ sử dụng xúc xắc tạo mật khẩu dựa trên. Nếu họ không sử dụng chúng, thì việc hạn chế chúng có thể hữu ích. Lưu ý rằng, mật khẩu dựa trên dicewire không cần hạn chế trên, dưới, chữ số, v.v.Vì vậy, hãy cẩn thận về việc hạn chế người dùng đối với một số quy tắc.

Ít về trình quản lý mật khẩu

Bên cạnh đó, hầu hết mọi người đều có điện thoại thông minh. Người ta có thể sử dụng quản lý mật khẩu để lưu trữ mật khẩu gần như là mật khẩu ngẫu nhiên do trình quản lý mật khẩu tạo và lưu trữ. Hãy cho người dùng biết về điều này. Một số trong số họ là miễn phí như LastPass, 1Mật khẩu, và KeePass.


Trả lời bình luận:

Tôi thực sự không thể sử dụng thuật toán sử dụng nhiều bộ nhớ (nếu tôi hiểu chính xác Độ cứng của bộ nhớ) vì đó là máy chủ. Cách tiếp cận có đúng không, SHA512 có phù hợp không và các lần lặp có phù hợp với độ dài mật khẩu không?

SHA-512 sử dụng rất ít bộ nhớ cho mật khẩu, chỉ cần lưu trữ 1024 bit để tạo hàm băm mật khẩu. Tham số bộ nhớ mặc định của Argon2 là $2^{12}$KiB = 4MiB. Nếu chúng tôi cho rằng một hệ thống có thể chạy bất kỳ số lượng luồng nào thì sức mạnh để cưỡng bức một thuật toán dựa trên SHA-512 sẽ giảm đi 32768 lần. Vì vậy, ngay cả việc sử dụng một chút bộ nhớ cũng tăng cường độ phức tạp của hàm băm mật khẩu bằng cách $2^{15}$. 4MiB hoàn toàn tốt cho các máy chủ và người ta có thể điều chỉnh bộ nhớ theo quyền truy cập đăng nhập mỗi giây hoặc tốt hơn là mua thêm bộ nhớ. Hãy nhớ rằng, các thuật toán băm mật khẩu để lại bộ nhớ cho hệ thống. Nút cổ chai cần xem xét là số lượng yêu cầu đăng nhập mỗi giây.


â¡) Kết quả tốc độ OpenSSL cho thấy SHA-512 100K là nhỏ.

Thực hiện sha512 trong 3 giây trên 64 khối kích thước: 10896142 sha512 trong 3 giây
Thực hiện sha512 trong 3 giây trên 256 khối kích thước: 4673961 sha512 trong 2,99 giây

*) Chúng ta mất bao nhiêu entropy mỗi lần lặp lại hàm băm mật mã

Squamish Ossifrage đã viết một câu trả lời tuyệt vời về điều này.. Cốt lõi của kết quả là

Thay vào đó, có một cơ hội tốt là đối với bất kỳ hàm cố định F nào, có rất nhiều chu kỳ trên đó F là một hoán vị và bị giới hạn trong đó F do đó bảo toàn entropy

Peter Morris avatar
lá cờ ng
Tôi thực sự không thể sử dụng thuật toán sử dụng nhiều bộ nhớ (nếu tôi hiểu chính xác Độ cứng của bộ nhớ) vì đó là máy chủ. Cách tiếp cận có đúng không, SHA512 có phù hợp không và các lần lặp có phù hợp với độ dài mật khẩu không?
kelalaka avatar
lá cờ in
@PeterMorris Chức năng băm mật khẩu có các tham số có thể điều chỉnh. Bạn cần đặt mục tiêu bảo mật của mình sau đó điều chỉnh các tham số. Nếu bạn không thể sử dụng bộ nhớ cao thì bạn cần tăng số lần lặp lại. Bạn có thể tìm thấy hiệu suất trên các diễn đàn hashcat, đặc biệt là đối với GPU.
stefreak avatar
lá cờ jp
Thuật toán băm mật khẩu @PeterMorris được sử dụng trên các máy chủ gần như 100% thời gian. Google nhanh chóng tiết lộ rằng Argon2 sử dụng 1MiB bộ nhớ theo mặc định. Điều này là hoàn toàn tốt và thường không phải là một vấn đề. Vui lòng không cuộn mã băm mật khẩu của riêng bạn, công cụ này rất khó để hiểu đúng. Đặc biệt nếu tiền cược cao.
Cort Ammon avatar
lá cờ gb
Để hiểu rõ nhận xét của stefreak, ở mức giá thị trường hiện tại, bạn đang nói về thứ gì đó ở mức bốn phần mười bộ nhớ DDR4 trị giá một xu. Nếu điều đó là không thể chấp nhận được, thì tôi nghĩ bạn nên suy nghĩ kỹ và lâu dài về việc liệu bạn có cơ sở hạ tầng cần thiết cho một hệ thống liên quan đến tiền hay không.
lá cờ il
@kelalaka có lý do nào khiến bạn đề xuất `argon2` thay vì thứ gì đó như https://en.wikipedia.org/wiki/Bcrypt không?
kelalaka avatar
lá cờ in
@N3buchadnezzar hầu hết thời gian Bcrypt đều ổn, như đã nêu trong [Wikipedia](https://en.wikipedia.org/wiki/Bcrypt#Comparison_to_other_password_hashing_algorithms). Tuy nhiên, Argon2 có hệ số song song hóa, khả năng chống kênh bên và tham số hóa độc lập (xem tham số của thư viện và so sánh với BCrypt) và Argon2 cũng là A KDF Bcrypt thì không.
Peter Morris avatar
lá cờ ng
@kelalaka Cảm ơn bạn đã trả lời chi tiết. Tôi đã cập nhật câu hỏi của mình liên quan đến argon2. Bạn có phiền cho tôi biết những gì bạn nghĩ, xin vui lòng? Cảm ơn!
kelalaka avatar
lá cờ in
@PeterMorris sau khi đã trả lời, đặc biệt là không thay đổi nguồn sau tất cả những điều này. Thay vào đó, bạn có thể hỏi một câu hỏi mới. Tôi đã khôi phục nó.
kelalaka avatar
lá cờ in
@PeterMorris Và, phiên bản của bạn cũng có thể được trang bị cho [security.se]. Tìm kiếm câu trả lời, ở đó quá.
Peter Morris avatar
lá cờ ng
@kelalaka Được rồi, tôi nghĩ sẽ ổn nếu nối thêm. Tôi sẽ cần loại tham số nào cho kích thước bộ nhớ + số lần lặp lại? Tôi không muốn máy chủ của mình bị tê liệt, nhưng tôi cũng không muốn nó quá dễ bị hỏng.
kelalaka avatar
lá cờ in
@PeterMorris tham số mặc định? Bạn có thể đo thời gian trên máy chủ của mình. Nói chung, chúng tôi yêu cầu tất cả các quy trình phải kết thúc sau 1 giây vì chúng tôi không muốn người dùng bị chậm. Bạn có thể đo lường máy chủ của mình và hỏi về vấn đề này trên [security.se] xem [this](https://security.stackexchange.com/questions/210982/what-are-the-minimum-parameters-for-argon2) hoặc [ tìm kiếm](https://security.stackexchange.com/search?q=argon2+parameter)
polfosol avatar
lá cờ in
Một mẹo vặt: Lastpass **KHÔNG** miễn phí. Nó giả vờ như vậy
Điểm:10
lá cờ in

Ngoài câu trả lời xuất sắc của @kelalka, đáng để chỉ ra những điểm khác biệt chính giữa cách triển khai của bạn và các phương pháp băm lặp tiêu chuẩn hơn như PBKDF2. Mặc dù PBKDF2 không phải là bộ nhớ cứng, nhưng giống như một số thuật toán băm mật khẩu mới hơn, tôi cho rằng nó (hoặc bcrypt) đủ cho hầu hết các mục đích. Nó có lẽ giống nhất với giải pháp đề xuất của bạn nên sẽ dễ hiểu hơn. https://en.wikipedia.org/wiki/PBKDF2

Một thay đổi quan trọng là nó băm mật khẩu liên tục với các kết quả trước đó. Điều này ngăn chặn sự hội tụ của hàm băm. Số lần lặp có lẽ là nhỏ so với không gian của hàm băm, vì vậy điều này có thể không đáng kể, nhưng nếu không gian hiệu quả kết thúc nhỏ hơn chúng ta nghĩ. Khi bạn băm các giá trị lặp đi lặp lại, mỗi lần lặp lại sẽ giảm một lượng nhỏ không gian đầu ra tiềm năng của bạn do va chạm. Khi lặp đi lặp lại nhiều lần, bạn sẽ nhận được ngày càng ít các giá trị khác nhau.

Ngoài ra, các yêu cầu về độ phức tạp của mật khẩu được coi là có hại. Hãy xem xét một chính sách mật khẩu hiện đại: https://auth0.com/blog/dont-pass-on-the-new-nist-password-guidelines/

Maarten Bodewes avatar
lá cờ in
Bạn có ý nghĩa gì với sự hội tụ của hàm băm? Một chu kỳ (có vẻ như vậy)? Và nếu vậy, làm thế nào để bao gồm một hằng số (tất nhiên là trong vòng lặp) giúp bạn tránh khỏi điều đó?
lá cờ ar
@MaartenBodewes: Tôi cho rằng ý nghĩa của Meir khi hội tụ là bởi vì các hàm băm mật mã (bị giới hạn trong phạm vi đầu ra của chúng) không phải là phép loại bỏ, nên việc lặp lại một hàm băm sẽ giảm dần số lượng đầu ra có thể và do đó làm tăng rủi ro như vậy xung đột giữa các giá trị băm lặp lại: nếu $H^{(m)}(a)=H^{(m)}(b)$ đối với một số $m$, thì $H^{(n)}(a)=H^{ (n)}(b)$ cho tất cả $nâ¥m$. Bao gồm đầu vào ban đầu trong hàm băm (nghĩa là thay thế $H$ bằng một cái gì đó như $H_a(x) =H(x\ ||\ a)$ ngăn chặn điều này: $H_a^{(m)}(a)=H_b^ {(m)}(b)$ có _not_ ngụ ý $H_a^{(n)}(a)=H_b^{(n)}(b)$ cho $n>m$.
lá cờ ar
… Điều đó nói rằng, miễn là hàm băm $H$ có độ dài đầu ra phù hợp, xung đột không phải là vấn đề thực sự lớn ngay cả đối với các hàm băm được lặp lại mà không cần điều chỉnh như vậy. Tôi nghĩ rằng tôi có một câu trả lời cũ ở đâu đó nơi tôi làm toán, nhưng về cơ bản nếu kích thước của không gian đầu vào _actual_ của hàm băm lặp lại (bao gồm cả mật khẩu thực tế và bất kỳ thứ gì mà kẻ tấn công vũ phu đã thử) thấp hơn đáng kể so với giới hạn sinh nhật, xung đột hầu hết là không liên quan. Đối với các hàm băm hiện đại có đầu ra 256 bit hoặc dài hơn, điều đó gần như chắc chắn xảy ra.
Maarten Bodewes avatar
lá cờ in
À, được rồi, điều đó có lý, mặc dù tôi nghĩ rằng việc mong đợi một vụ va chạm 256 bit xảy ra vẫn còn là một khái niệm khá xa vời. Bây giờ tôi đã hiểu tại sao muối hoặc mật khẩu thường được lặp lại trong đầu vào. .... uh yeah, những gì bạn nói :P
Meir Maor avatar
lá cờ in
Nếu chúng tôi có một PRF thực sự thì vấn đề thực sự có vẻ nhỏ. Nhưng chúng tôi lo lắng rằng chúng tôi không thực sự có PRF thực sự và việc băm lặp đi lặp lại ngây thơ có thể khuếch đại những điểm không hoàn hảo nhỏ của PRF của chúng tôi. Tôi cũng thấy không có lý do gì để bỏ qua những vấn đề nhỏ có thể sửa chữa được.
ilkkachu avatar
lá cờ ws
Một vấn đề hơi liên quan là vì thứ của họ đã khá gần với PBKDF2, nên họ cũng có thể _sử dụng PBKDF2_, vì vậy ít nhất họ cũng biết được điều gì đó.
Meir Maor avatar
lá cờ in
Chắc chắn tôi đã nói nó tương tự như PBKDF2 và rõ ràng mọi người nên sử dụng những thứ tiêu chuẩn. PBKDF2 không phải là công nghệ tiên tiến, nhưng vẫn đủ khi được điều chỉnh IMHO đúng cách. Mặc dù về mặt cá nhân, đó là lựa chọn hợp lý ít được yêu thích nhất của tôi, nhưng tôi đã từng thích bcrypt hơn và nó có lợi thế là tồn tại mãi mãi không tì vết, và bây giờ chúng tôi có các họ argon và scrypt. Vì vậy, mặc dù tôi cho rằng PBKDF2 đủ nhưng IMHO là lựa chọn hợp lý nhất.
kelalaka avatar
lá cờ in
@IlmariKaronen có một [tại đây](https://crypto.stackexchange.com/q/15068/18298).
Điểm:9
lá cờ cn

Bạn không nên thiết kế mã băm mật khẩu của riêng mình.

Việc tạo ra các chức năng mật mã vẫn là một quá trình thử và sai. Chắc chắn, theo thời gian, chúng tôi đã tình cờ phát hiện ra một số điều là một ý tưởng hay hoặc thậm chí là bắt buộc. Và chúng tôi chắc chắn đã học được rất nhiều điều mà đừng công việc. Nhưng chúng tôi không biết làm thế nào để tạo ra những thứ đã được chứng minh là an toàn. Một lỗi nhỏ rất tinh vi có thể khiến cấu trúc mật mã bị lỗi nghiêm trọng. Và có rất nhiều cơ hội cho những sai lầm như vậy. Tôi sẽ kể tên một số sau.

Điều tốt nhất chúng tôi có thể làm ngay bây giờ là những người có kinh nghiệm trong lĩnh vực này tạo ra một thứ tiền điện tử, và sau đó mọi người sẽ cố gắng phá vỡ thứ tiền điện tử đó. Nếu mọi người cố gắng hết sức và không thành công trong một thời gian dài thì chúng ta có thứ gì đó có lẽ đủ tốt. Chúng tôi vẫn không thể chứng minh sự vắng mặt của các vấn đề, nhưng nếu hàng ngàn nhà phân tích mật mã không thể, thì hy vọng hàng nghìn người tiếp theo cũng không thể.

Nhưng ngay cả điều này thất bại theo thời gian. Đôi khi sau nhiều năm, thậm chí nhiều thập kỷ, một vấn đề nghiêm trọng được tìm thấy trong một thứ đã được những người thông minh nhất xem xét kỹ lưỡng trong nhiều năm. Đó là lý do tại sao MD5 không còn được coi là ổn nữa và tại sao RC4 được coi là có vấn đề. Hoặc cảnh quan thay đổi, ví dụ hàng đầu. đến nhu cầu về muối trong hàm băm mật khẩu và các hàm băm làm chậm có chủ ý.

Bằng cách sử dụng các thuật toán mật mã được biết đến nhiều nhất hiện nay, chúng ta có thể tận dụng trải nghiệm tập thể này và có thể tránh lặp lại những sai lầm trong quá khứ. Sai lầm mới có thể bị phát hiện, nhưng điều đó không thể tránh được. Tuy nhiên, một số người xây dựng các chức năng tiền điện tử của riêng họ có khả năng lặp lại một số sai lầm đó hoặc tạo ra những sai lầm hoàn toàn mới.

Tôi biết, tôi biết, thật thú vị khi tự mình thiết kế những thứ đó. Và thật tuyệt khi xây dựng thứ gì đó mang lại cảm giác an toàn. Stack Exchange có rất nhiều câu hỏi về mã hóa tùy chỉnh và (đặc biệt) băm mật khẩu. Vấn đề là, thật dễ dàng để xây dựng một cái gì đó mà bản thân bạn không thể phá vỡ. Nhưng điều đó không có nghĩa là những người khác không thể.Câu ngạn ngữ này đã có từ xa xưa và được nhắc đến thường xuyên đến mức ngày nay nó được gọi là Định luật Schneier.

Cái mà có thể sai lầm?

Vì vậy, có thể có vấn đề với cốt lõi của thuật toán tiền điện tử. Đây là thứ đã phá vỡ MD5 và RC4.

Hoặc thuật toán có thể hoàn toàn ổn, nhưng việc triển khai có thể bị hỏng. Đây có thể là một lỗi đơn giản hoặc có thể là một lỗi tinh vi hơn như lỗi tấn công kênh phụ (đôi khi khó tránh một cách đáng ngạc nhiên).

Nhưng cũng có thể (dễ dàng, thậm chí) đối với các nguyên hàm mật mã an toàn với các triển khai không có lỗi được sử dụng không chính xác, khiến hệ thống không an toàn. Ví dụ: sử dụng chính xác mã hóa và chữ ký số, nhưng đưa ra các giả định ngây thơ trong quá trình bắt tay giao tiếp (SSL có một số vấn đề với điều này). Một ví dụ nổi tiếng khác là AES-ECB, sử dụng AES hoàn hảo theo cách có thể làm rò rỉ thông tin quan trọng.

Trong hàm băm của bạn?

Chức năng băm mật khẩu của riêng bạn cũng trở thành con mồi của một thứ như thế này ở đây:

lặp lại 100_000:
    hàm băm = sha512(băm)

SHA-512 hoàn toàn ổn (theo như chúng tôi biết). Sử dụng nó như thế này là cau mày.

SHA-512 tạo đầu ra 512 bit "không thể phân biệt với ngẫu nhiên" cho mọi đầu vào. Nó có thể tạo ra cùng một đầu ra cho hai đầu vào riêng biệt, điều này được gọi là xung đột. Vấn đề là các hàm băm N-bit trên đầu vào N-bit thường không phỏng đoán. Điều đó có nghĩa là khi cung cấp đầu ra SHA-512 cho chính nó, một số giá trị 512 bit có thể sẽ xung đột với các giá trị khác, tạo ra cùng một đầu ra. Qua sự cần thiết, điều này cũng có nghĩa là một số giá trị băm khác hoàn toàn không thể được tạo.

Hãy xem cách điều này hoạt động đối với SHA-512, bị cắt bớt thành 4 bit. Cụ thể, chúng tôi lấy byte đầu tiên từ đầu ra và loại bỏ 4 bit cao trong byte này. Byte đơn kết quả được sử dụng làm đầu vào cho vòng tiếp theo. Các cách chọn bit khác nhau cho kết quả khác nhau, nhưng nguyên tắc là giống nhau.

Thử tất cả 16 đầu vào có thể trong vài vòng sẽ cho chúng ta các chuỗi sau:

trong 1. 2. 3. 4. 5. 6. 7.
00 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08
06 -> 08 /
07 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06
08 -> 06 /   
03 -> 04 -> 05 \
13 -> 15 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14
04 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14 /
15 -> 05 -> 09 -> 02 -> 10 -> 14 /
05 -> 09 -> 02 -> 10 -> 14 -> 14  
01 -> 11 -> 02 -> 10 -> 14 /
09 -> 02 -> 10 -> 14 -> 14  
11 -> 02 -> 10 -> 14 /
02 -> 10 -> 14 -> 14  
12 -> 10 //
10 -> 14 -> 14   
14 -> 14 /

Chỉ sau 6 vòng, 16 đầu ra có thể đã giảm xuống chỉ còn 3. Hiệu ứng tương tự có thể được nhìn thấy đối với các đoạn cắt ngắn lớn hơn. Tôi đã chạy một số mô phỏng cho SHA-512 bị cắt bớt thành 1 byte đầu tiên (2â¸), 2 byte (2¹â¶) và 3 byte (2²â´):

                byte: 1 2 3
          không gian đầu vào: 256 65536 16777216
hội tụ về giá trị M: 13 330 2765
       sau N vòng: 31 518 7114

Bạn có thể thấy rằng hiệu ứng hội tụ xuất hiện trong cả ba kịch bản. Đối với SHA-512 chưa cắt, máy tính của tôi không đủ nhanh để tính toán điều này, tôi không thể tìm thấy bất kỳ thông tin nào về độ mạnh và mức độ chắc chắn của hiệu ứng và tôi không đủ thông minh để tạo ra bằng chứng (nếu bằng chứng là thậm chí có thể). Nhưng tỷ lệ cược là bạn cũng sẽ thấy hiệu ứng trong SHA-512 đầy đủ. Bản năng của tôi nghi ngờ rằng nó làm giảm không gian băm bằng căn bậc hai của nó (giảm một nửa độ dài bit), nhưng tôi có thể đã rất sai [cập nhật: xem các liên kết được cung cấp trong các nhận xét: một, hai, số ba]. 100k viên đạn có lẽ cũng hạn chế sát thương.

Bây giờ, điều này có thực sự gây hại cho hàm băm của bạn không? Chắc là không. Nhưng nó một điểm yếu, một điểm yếu mà các hàm băm mật khẩu trong thế giới thực cần cẩn thận tránh (ví dụ: bằng cách đảm bảo mật khẩu và muối được trộn lại thường xuyên).

Tôi nghĩ đây là một ví dụ tuyệt vời về những cái bẫy tinh vi trong thiết kế tiền điện tử. Thật dễ dàng để bỏ lỡ một cái gì đó như thế này. Đó là lý do tại sao tôi khuyên bạn nên sử dụng thuật toán đã được thử nghiệm trong trận chiến. Chúng tốt hơn bất cứ thứ gì bạn hoặc tôi có thể nghĩ ra.

Các câu trả lời khác đã đưa ra một số khuyến nghị về việc sử dụng hàm băm nào; Được rồi: pbkdf2, bcrypt. Tốt hơn: argon2, scrypt. Tôi nghe thấy Balloon là một thứ, nhưng tôi không biết gì về nó nên tôi không có ý kiến ​​gì về nó.

kelalaka avatar
lá cờ in
FYI. Có một phép tính cho trường hợp chung [Entropy khi lặp lại các hàm băm mật mã](https://crypto.stackexchange.com/q/15068/18298). Tôi đã nhớ một cái khác, tuy nhiên, không thể tìm thấy.
chux - Reinstate Monica avatar
lá cờ cn
Câu trả lời hay giải quyết trực tiếp mã của OP.
kelalaka avatar
lá cờ in
Ok, [Tôi đã tìm thấy thứ mình đang tìm kiếm](https://crypto.stackexchange.com/a/51029/18298) và câu trả lời sẽ khiến bạn ngạc nhiên. Chúng tôi không mong đợi rằng các hàm băm mật mã được lặp lại đang mất quá nhiều entropy nhờ vào [các chu kỳ lớn dự kiến](https://crypto.stackexchange.com/a/68442/18298) do công trình của Harris.
marcelm avatar
lá cờ cn
@kelalaka Rất thú vị, cảm ơn vì các liên kết! Nhưng nếu tôi hiểu [liên kết thứ ba](https://crypto.stackexchange.com/a/68442) một cách chính xác, thì điều đó có nghĩa là các phần tử _few_ tương đối dự kiến ​​sẽ theo chu kỳ. Trên thực tế, khoảng â trong số chúng, do đó, việc lặp lại cuối cùng sẽ giảm không gian hiệu quả của nó xuống căn bậc hai của các phần tử, giảm một nửa độ dài bit hiệu quả. Hay tôi đang hiểu sai điều gì đó?
kelalaka avatar
lá cờ in
Điểm bạn có thể bỏ lỡ là 1M quá nhỏ để thấy hiệu ứng này. Liên kết đầu tiên nói về 256 lần lặp và liên kết thứ ba nói về thời điểm lặp đi đến căn bậc hai. Hầu hết các yếu tố vẫn còn trên đuôi ...
marcelm avatar
lá cờ cn
Đủ công bằng. Loại toán học đó luôn thú vị, nhưng thật khó để nắm bắt tốt các thang đo liên quan. Mặc dù vậy, tôi đã lưu ý rằng hiệu ứng hạn chế do số vòng trong câu trả lời ban đầu của tôi, nhưng dù sao toàn bộ phần đó chỉ là linh cảm :)
Điểm:1
lá cờ cn

Nó nghĩ rằng câu trả lời là: "An toàn" là tương đối. Chỉ riêng 512 bit muối (8 * 64 bit) đã cung cấp khoảng 6 * 10^57 khả năng. Biến đổi muối (thông qua BASE64) không làm thay đổi độ mạnh của nó.

Sau đó, bạn có 992 bit (62 * 16 bit) tạo mật khẩu (26 * 2 chữ cái cộng với 10 chữ số) hoặc khoảng 4 * 10^28 khả năng. Giả sử xác suất đồng nhất (khá khó xảy ra nếu được chọn bởi con người), bạn sẽ có khoảng 1504 bit đầu vào để tạo ra 512 bit đầu ra, tối đa (có khả năng xảy ra xung đột) 5 * 10^452 khả năng. Đó là một to lớn con số.

Các con số giả định rằng muối không thể được "loại bỏ" khỏi hàm băm, do đó, muối mở rộng phạm vi tìm kiếm.

Việc lặp lại hàm băm sẽ chỉ làm chậm việc xây dựng bảng, không tra cứu được kết quả (bảng kết quả sẽ có tối đa 2^512 mục lớn).

kelalaka avatar
lá cờ in
Chúng tôi coi rằng muối là công khai. Đối với những kẻ tấn công vũ phu, nó chỉ ngăn chặn các bảng cầu vồng và chúng sẽ chỉ tìm kiếm mật khẩu chứ không phải mật khẩu và muối. Kẻ tấn công vào hệ thống sẽ nhận được muối và hàm băm. Chúng thường được lưu trữ trong một chuỗi. Do đó, chỉ có độ mạnh của mật khẩu và cơ chế băm mật khẩu là quan trọng.
kelalaka avatar
lá cờ in
Muối giết chết những chiếc bàn cầu vồng. Đó là hiển nhiên. Tuy nhiên, tính bảo mật của hàm băm mật khẩu không dựa trên tính bí mật của muối.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.