Các lập trình viên web nên biết rằng họ không bao giờ nên cố gắng tự thực hiện mật mã.
Cụ thể, điều đó có nghĩa là không có chuyên gia phi bảo mật nào được chạm trực tiếp vào bất kỳ nguyên tắc mã hóa nào. Họ không nên suy nghĩ ở cấp độ AES, SHA-1, v.v. Thay vào đó, họ nên sử dụng các chức năng cấp cao để mã hóa và ký tin nhắn và để "băm" mật khẩu.
Tại sao? Bởi vì nếu không, mọi người sẽ lầm tưởng rằng:
- AES-256 là "mã hóa tuyệt vời", mặc dù thực tế là họ đang sử dụng nó trong chế độ ECB hoặc sử dụng các giá trị IV không ngẫu nhiên, v.v. (Trong một số chế độ, IV không ngẫu nhiên nhưng duy nhất là ổn. rất nhiều.)
- Họ có thể sử dụng cùng một khóa đối xứng để mã hóa nhiều tin nhắn (hoặc tệ hơn là lưu trữ khóa đối xứng trong mã để sử dụng trực tiếp).
- Họ thậm chí có thể quyết định sử dụng cụm mật khẩu trực tiếp làm khóa mà không sử dụng bất kỳ chức năng phái sinh chính nào.
- Họ có thể sử dụng RSA để mã hóa dữ liệu trực tiếp.
- Họ có thể chỉ cần "muối và MD5" mật khẩu của mình để giữ an toàn. (Nếu bạn nghĩ bảng cầu vồng là liên kết yếu nhất, hãy nghĩ lại .)
Chỉ cần ở trên cùng một trang, không có mục nào ở trên là ổn cả . Nếu bạn không có được điều đó, thì bạn không nên chạm vào tiền điện tử bằng sào 10 feet! (AES-256 là mã hóa tuyệt vời, nhưng chỉ khi bạn sử dụng đúng cách. "Đây không phải là kích thước quan trọng, đó là những gì bạn làm với nó." :-))
Tôi đang nói về loại chức năng cấp cao nào? Cá nhân tôi khuyên bạn nên sử dụng thư viện OpenPGP (cho dữ liệu khi nghỉ ngơi) hoặc SSL (cho dữ liệu đang chuyển động). Các giao thức này cứng nhắc xác định việc sử dụng đúng các thuật toán băm không đối xứng, đối xứng và băm. Ví dụ: với OpenPGP:
- Nó không sử dụng RSA để mã hóa dữ liệu trực tiếp mà thay vào đó tạo ra khóa phiên ngẫu nhiên (đối xứng) cho mỗi tin nhắn (điều này rất quan trọng) và sử dụng RSA để mã hóa khóa phiên đó.
- Nó sử dụng chức năng phái sinh chính để chuyển đổi cụm mật khẩu thành khóa. (Theo cách nói của OpenPGP, nó được gọi là S2K, nhưng tôi nghĩ "hàm dẫn xuất chính" là thuật ngữ chuẩn hơn.)
- Nó xử lý chọn một chế độ tốt, vì vậy bạn sẽ không bao giờ kết thúc việc sử dụng ECB.
- Nó xử lý việc quản lý khóa cho bạn, vì vậy bạn không phải đưa ra quyết định đột xuất về việc khóa nào đáng tin cậy, v.v.
Tóm tắt: nếu bạn không phải là chuyên gia bảo mật và bạn đang suy nghĩ ở cấp độ AES hoặc SHA-1 hoặc (trời cấm) MD5, bạn đã làm sai . Sử dụng thư viện được viết bởi các chuyên gia bảo mật (như Bouncy Castle), thực hiện các giao thức được thiết kế bởi các chuyên gia bảo mật (như OpenPGP để mã hóa, hoặc bcrypt hoặc mã hóa để băm mật khẩu), thay vì tự cuộn.
Tôi không phải là một chuyên gia về tiền điện tử, nhưng tôi biết đủ để không cố gắng thiết kế các giao thức đặc biệt của riêng mình. Nói rõ hơn, toàn bộ bài đăng này là tài liệu Mật mã 101 . Vì vậy, nếu bài đăng này không có ý nghĩa 100% với bạn, thì bạn chắc chắn không nên đến bất cứ nơi nào gần mật mã.