Sau Lúc gọi bài viết băm mật khẩu đúng cách dán của anh ấy thaidn, bản thân nhớ lại lúc bản thân new ra trường, cũng đã từng có lần nghĩ về về vụ việc này (cơ hội kia bản thân hơi ưng ý môn Bảo Mật Thông Tin trên trường) dẫu vậy chưa bao giờ hiểu tường tận. Chỉ biết là ko nên:

Lưu password sinh hoạt dạng plain-text.Hash với 1 thuật toán hash mạnh dạn, không nên xài MD5, SHA-1 ...Hash cùng với salt.

Bạn đang xem: Sử dụng mã hóa password bcrypt của zf

Chỉ hiểu đúng bản chất đề nghị đề nghị làm cố, tuy vậy thiếu hiểu biết nhiều vì sao lại điều đó cùng một số trong những thắc mắc không giống cũng không trả lời được như:

Password user trình lên, bắt buộc hash sống client tuyệt sinh hoạt VPS.Salternative text đề nghị lưu ở chỗ nào.Salt gồm cần giữ kín giỏi không?Salt thông thường mang lại toàn bộ, tốt salternative text riêng rẽ mang đến từng user?

Hôm nay, mình ra quyết định đi tìm câu trả lời mang đến phần nhiều sự việc bản thân thắc mắc, vậy do mang định nó đúng.

1. Tại sao tránh việc lưu lại plain-text, encrypt hoặc cần sử dụng MD5, SHA-1

Nếu lưu plain-text, database bị hachồng, SQL-injection, password user chìa ra theo một giải pháp cần thiết thuận tiện rộng nhằm đánh tráo.

Nếu mã hóa 2D, đang luôn tất cả một cách để giải thuật bằng một chìa-khóa như thế nào kia, đã đề xuất search giải pháp giữ chìa-khóa một cách bình an.

MD5 và SHA-1 được chứng minh gồm chạm độ, tức thị 2 password không giống nhau, lúc hash bởi MD5 hoặc SHA-1 hoàn toàn có thể ra và một chuỗi.

2. Tại sao bắt buộc salt

Ta đang biết, hash algorithm là one-way-function, tức là không thể suy ngược thẳng ra password nếu có hash_value (khác cùng với mã hóa, có thể giải mã trải qua chìa-khóa).

Tuy nhiên vẫn có cách để từ bỏ hash_value có thể suy gián tiếp ra được password ví dụ brute-force attach, dictionary attach -> điểm phổ biến là ta đề nghị thửđoán password các lần cho tới khi đúng chiếc nên tra cứu.

Một phương pháp không giống chính là ta hoàn toàn có thể tính toán thù trước cực hiếm hash của tất cả những trường hòa hợp với của tất cả những thuật toán thù -> biện pháp này nặng nề, tốn thời hạn, nhưng bây chừ cùng với vận tốc tính tân oán của máy tính, ta vẫn hoàn toàn có thể có tác dụng được. Bảng lưu trữ password + hash_value của password Gọi là Rainbow Table, có thể tự chế tạo ra hoặc cài đặt một trong những bạn dạng miễn giá tiền hoặc trả tiền để sở hữ. Từ hiện nay trường hợp ta bao gồm hash_value ta rất có thể mapping để suy ra được password.

Tuy nhiên nếu như ta chỉ hash mỗi password, ta gặp gỡ điều này là:

2 password như là nhau (user vô tình trùng password) thì chuỗi hash(password) đã giống nhau.User cố tình đặt password dễ dàng với phổ cập (ví dụ password dễ dàng ghi nhớ mang lại user nhưng lại dễ tra ngược.

Và nếu như chỉ hash password thì ví như mất hash_value, rất có thể tra trong rainbow table để đưa ra được password của người tiêu dùng.

Giờ ta test cố kỉnh vày hash(password) ta sẽ hash(salternative text + password):

Từ md5(123456)

id | hash_md5 |---------------------------------------1 | e10adc3949ba59abbe56e057f20f883e |Thành md5(7nWZLcCK0vsPzIM + 123456)

id | hash_md5 | salt |---------------------------------------------------------1 | 0510210d4b370165658bdc0d0b005244 | 7nWZLcCK0vsPzIM |Giờ giả sử, ta mất bảng tài liệu có hash_md5, salternative text, kẻ tiến công đã bắt buộc tính tân oán lại rainbow table của toàn bộ các ngôi trường vừa lòng cộng với salt. Nếu salternative text là random mang lại từng user, kẻ tiến công sẽ đề xuất tính toán thù cục bộ ngôi trường thích hợp cùng cùng với riêng biệt từng salt đến cục bộ user.

Ngân sách đến 2 phnghiền tính trên là cực kỳ bự với tốn tương đối nhiều thời hạn để triển khai. Vậy tóm lại mục đích của salt với random-salternative text là:

Bảo vệ user của cả khi user dùng password phổ biến với password ko to gan lớn mật vì user quan trọng nhớ được những password phức tạp tuy thế vận tốc tính toán của máy tính thì ngày càng nhanh.Tạo ra nhiều ngân sách tính tân oán, kẻ tấn công bắt buộc tính tân oán trước rainbow table.

=> Ta trả lời đc 3 câu hỏi:

Salt có thể lưu lại vào database, cùng với hash_value.Không buộc phải kiếm tìm biện pháp duy trì kín đáo salternative text, cơ mà cũng chớ từ bỏ ý công khai salt.Nhưng bắt buộc phải random salt mang lại từng user.

Xem thêm: Jpa Là Gì ? Tại Sao Chúng Ta Cần Sử Dụng Nó? Sự Khác Nhau Giữa Jpa Với Hibernate

3. Hash ở đâu?

Giờ giả sử hash(password) ở client-side thì sự việc là gì?

Biết được thuật toán dùng làm hash.Salternative text vẫn đề xuất hiện ra ngơi nghỉ client, do ta cần hash password cùng với salternative text (hash(salternative text + password)), và db chỉ lưu lại kết quả hash, ko lưu salternative text.Nhưng ví như salt sinh ra ngơi nghỉ client và salt random thì làm thế nào để compare cùng với hash_value vào database? Vì lần xác thực cho tới, salternative text vẫn lại random cùng đang không giống với kết quả vào database -> salternative text buộc phải tuyệt nhất mang lại tất cả các ngôi trường thích hợp.Hoặc salternative text rất có thể giữ ngơi nghỉ DB, tuy thế server bắt buộc gửi salt về trước cho user trước lúc thực hiện hash -> dễ ợt hiểu rằng salternative text hơn.

Nhìn sơ thì thấy câu hỏi sử dụng tốt nhất một salt đã chống lại vấn đề làm việc mục số 2. Vậy quá trình xác thực chính xác là như vậy nào?

User đã gửi plain-text password lên VPS với over HTTPs.Server vẫn đánh giá vào database lôi ra salternative text của user đó, cộng chuỗi ta được salt + password.Thực hiện hash(salt + password) bên trên server side.Compare công dụng bên trên cùng với hash_md5 trong database.

4. Tại sao dùng bcrypt nuốm đến SHA-512

Kết trái của SHA-512 có độ dài 128 kí từ bỏ, độ lâu năm của key là 64 bytes. Trông dường như cũng tương đối chắc chắn, vậy tại sao OWASP.. recommkết thúc sử dụng PBKDF2, bcrypt hoặc scrypt rộng là SHA2?

SHA2 là hash algorithm (vớ nhiên), nó có phong cách thiết kế cùng với mục tiêu là tốc độ, với những CPU tân tiến, có thể generate hàng ngàn hiệu quả trên giây. Nếu dùng một thuật toán bao gồm vận tốc nlỗi SHA2 Có nghĩa là bạn sẽ rước lợi điểm cho tới đến kẻ tiến công brute-force. Thuật toán thù nkhô cứng + cấu hình server mạnh mẽ, vấn đề brute-force càng trsống lên lập cập hơn.

Trong khi đó, bcrypt được Hotline là slow-hash algorithm, bcrypt() mất 100ms nhằm tính toán ra chuỗi hash, chậm trễ rộng 10.000 lần đối với sha1().

tức là vẫn đã đạt được mục tiêu hash nhưng lại giảm thiểu nguy cơ tiềm ẩn tiến công brute-force.

Tóm lại: SHA-512 không hẳn là một trong những thuật toán yếu ớt, mà sự việc là SHA-512 ko tương xứng mang đến câu hỏi hash password. Nếu buộc phải hash password thì ta đề nghị sử dụng các thuật toán thù slow hash nhỏng PBKDF2, bcrypt và scrypt.

5. Tại sao bắt buộc Pepper?

Một thực tiễn là nếu khách hàng chỉ gồm "muối" mà lại không có "tiêu", ăn làm thịt con gà luộc sẽ không còn ngon :v. Giả sử, database các bạn chạy RAID-1, một ổ cứng hỏng cùng bắt buộc thay một ổ cứng mới. Nhưng nlỗi ta biết, đĩa bị hư là mirror của đĩa còn sót lại, bạn đề nghị tiêu diệt ổ cứng lỗi đó nếu như không có ai kia rất có thể lục thùng rác với tái tạo ra lại một trong những phần dữ liệu trong đĩa lỗi kia.

Xin xem xét, bạn cần wipe trước khi quăng quật bỏ một ổ cứng có tài liệu dù cá thể giỏi hệ thống, tuy nhiên đĩa bị sốc điện, bad-sector thì wipe cũng chưa đầy đủ an toàn, rất tốt yêu cầu ngiền ra buồn chán.

Dù random-salt vẫn có tác dụng tăng chi phí tạo thành rainbow table nhưng mà đời lần chần đâu cơ mà lần, kẻ tiến công luôn có những rượu cồn lực siêu hạng để dành được dòng bạn thích. Giả sử kẻ tấn công gồm một khôn xiết khôn cùng máy vi tính cùng một mirror ổ cứng lỗi lục trường đoản cú một chiếc thùng rác làm sao kia. Với vô cùng laptop đó, ta có rainbow-table nhằm tra ngược ra password cần tìm.

Vậy làm thế nào để sút thiểu nguy hại trên? Nguyên ổn tắc là không vứt tất cả trứng trong một giỏ, đó là pepper. Pepper là một trong chuỗi tương tự như như salternative text, nhưng mà khác biệt là ta nên giữ lại kín pepper, lưu lại tại 1 chỗ khác ngoại trừ database, cùng không buộc phải pepper-per-user, chỉ cần 1 pepper là đủ.

Từ

hash(salternative text + password)Thành

hash(pepper + salternative text + password)Ta nên giữ pepper sinh sống application hoặc ở 1 service không giống, nếu database bị compromise, thì kẻ tiến công cũng không tồn tại pepper để tạo thành rainbow-table.

6. Bonus

*

Trong Lúc kiếm tìm câu vấn đáp nhằm viết bài này, mình tìm được một bài bác blog của dropbox nói về kiểu cách bọn họ lưu giữ password ra làm sao. Thấy gồm 2 điểm khá giỏi yêu cầu ý muốn nói thêm.

Trước Khi hash password cùng với salt-per-user, chúng ta bao gồm SHA512(password) trước để cố định độ lâu năm của input-password. Theo Dropbox thì câu hỏi này giải quyết 2 issues của bcryptMột số implementation của bcrypt cắt đầu vào còn 72 bytes.Một số implementation không giống của bcrypt thì không cắt đầu vào tuy vậy dẫn tới một vụ việc không giống là DoS attachồng cũng chính vì cho phép độ dài password tùy ý.Dropbox cũng có global pepper tuy thế cố kỉnh do dùng nó nhằm hash thì bọn họ encrypt. Tức là nuốm vị hash(pepper + salternative text + password) thì bọn họ AES256(salternative text + password) + global-pepper-key. Theo như bọn họ giải thích thì pepper là một lớp phòng vệ sâu rộng cùng tàng trữ tại một chỗ đơn nhất. Nhưng đồng nghĩa với việc là chỗ lưu trữ pepper vẫn rất có thể bị compromise, với lúc bị compromise thì câu hỏi rotate key không tiện lợi. Dùng pepper để encrypt vẫn đạt được mục đích bảo mật giống như tuy nhiên thêm kĩ năng rotate key Lúc bị compromise.

7. Migrate

Sau Khi viết bài xích này, bạn

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *