Hướng dẫn dùng cryptographically secure trong PHP - sử dụng mật mã an toàn trong PHP
Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ passwordKhi lưu trữ password vào CSDL thường sẽ sử dụng các hàm băm khác nhau được hỗ trợ bởi hệ CSDL hoặc ngôn ngữ lập trình (như MD5, SHA1 ...) để tạo dữ liệu mã hóa, dữ liệu mã hóa đó được lưu vào CSDL. Ví dụ: Show
Nội dung chính ShowShow
$raw_password = 'abc123'; $crypt = md5($raw_password); //e99a18c428cb38d5f260853678922e03 Ví dụ trên, đã sử dụng hàm băm của PHP là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);0 để mã hóa password $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1, kết quả mã hóa là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 Bởi vì hàm băm tạo ra các giá trị không thể dịch ngược (không có thuật toán để giải giá trị hash $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 là chuỗi $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1, chỉ duy nhất một cách là thử), nên có cảm giác sẽ an toàn. Tuy nhiên với các mật khẩu yếu, nó có thể bị dò ra dựa trên giá trị băm của các mật khẩu phổ biến biết trước. Như trường hợp trên khi thấy $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 thì đoán được password là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1. Để khắc phục điều này có thể sử dụng đến salt Sử dụng Salt tăng cường an toàn cho mật khẩuGiải mã: Cân nhắc thiết kế khác: $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt); Quan trọng: Khi nào không sử dụng mã hóa Ví dụ về mã hóa chuỗi PHP với Libsodiummã hóa và xác thực , và tại sao bạn có thể muốn mã hóa được xác thực hơn là chỉ mã hóa . Halite - Libsodium được tạo ra dễ dàng hơn Ví dụ với mã hóa defuse / php
"Nhưng tôi thực sự muốn sử dụng mật khẩu." Ví dụ trên, đã sử dụng hàm băm của PHP là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);0 để mã hóa password $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1, kết quả mã hóa là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 Bởi vì hàm băm tạo ra các giá trị không thể dịch ngược (không có thuật toán để giải giá trị hash $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 là chuỗi $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1, chỉ duy nhất một cách là thử), nên có cảm giác sẽ an toàn. Tuy nhiên với các mật khẩu yếu, nó có thể bị dò ra dựa trên giá trị băm của các mật khẩu phổ biến biết trước. Như trường hợp trên khi thấy $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 thì đoán được password là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1. Để khắc phục điều này có thể sử dụng đến salt Để phức tạp hóa mật khẩu lưu trữ, thì các mật khẩu gốc trước khi mã hóa được nối thêm các chuỗi, các chuỗi thêm này gọi là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt); 7
Giải mã:
Cân nhắc thiết kế khác:
Ví dụ trên, đã sử dụng hàm băm của PHP là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);0 để mã hóa password $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1, kết quả mã hóa là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 Luôn có chuyên gia mật mã xem xét việc triển khai của bạn. Nếu bạn không đủ may mắn để làm bạn với một sinh viên mật mã tại trường đại học địa phương của bạn, bạn luôn có thể thử diễn đàn Cryptography Stack Exchange để được tư vấn. Bởi vì hàm băm tạo ra các giá trị không thể dịch ngược (không có thuật toán để giải giá trị hash $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 là chuỗi $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1, chỉ duy nhất một cách là thử), nên có cảm giác sẽ an toàn. Tuy nhiên với các mật khẩu yếu, nó có thể bị dò ra dựa trên giá trị băm của các mật khẩu phổ biến biết trước. Như trường hợp trên khi thấy $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);2 thì đoán được password là $raw_password = 'abc123'; //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB $salt = random_bytes(32); //Sử dụng thêm một salt cố định $staticSalt = 'G4334#'; $crypt = md5($staticSalt.$raw_password.$salt);1. Để khắc phục điều này có thể sử dụng đến salt Quan trọng: Khi nào không sử dụng mã hóaKhông mã hóa mật khẩu . Thay vào đó,bạn muốn băm chúng bằng cách sử dụng một trong các thuật toán băm mật khẩu sau: . Thay vào đó,bạn muốn băm chúng bằng cách sử dụng một trong các thuật toán băm mật khẩu sau:
Không bao giờ sử dụng hàm băm có mục đích chung (MD5, SHA256) để lưu trữ mật khẩu. Không mã hóa Tham số URL . Đó là công cụ sai cho công việc.Đó là công cụ sai cho công việc. Ví dụ về mã hóa chuỗi PHP với LibsodiumNếu bạn đang sử dụng PHP
Sau đó, để kiểm tra nó ra:
Halite - Libsodium được tạo ra dễ dàng hơnMột trong những dự án mà tôi đang thực hiện là một thư viện mã hóa có tên là Halite , nhằm mục đích làm cho libsodium trở nên dễ dàng và trực quan hơn.
Tất cả các mật mã cơ bản được xử lý bởi libsodium. Ví dụ với mã hóa defuse / php
Lưu ý : 9trả về đầu ra được mã hóa hex.
Quản lý khóa mã hóaNếu bạn muốn sử dụng "mật khẩu", hãy dừng lại ngay bây giờ. Bạn cần một khóa mã hóa 128 bit ngẫu nhiên, không phải một mật khẩu dễ nhớ của con người. Bạn có thể lưu trữ một khóa mã hóa để sử dụng lâu dài như sau:
Và, theo yêu cầu, bạn có thể truy xuất nó như sau:
Tôi mạnh mẽ khuyên bạn nên chỉ lưu trữ một chìa khóa được tạo ra một cách ngẫu nhiên để sử dụng lâu dài thay vì bất kỳ loại mật khẩu là chìa khóa (hoặc để lấy được chìa khóa).mạnh mẽ khuyên bạn nên chỉ lưu trữ một chìa khóa được tạo ra một cách ngẫu nhiên để sử dụng lâu dài thay vì bất kỳ loại mật khẩu là chìa khóa (hoặc để lấy được chìa khóa). Nếu bạn đang sử dụng thư viện của Defuse:
"Nhưng tôi thực sự muốn sử dụng mật khẩu."Đó là một ý tưởng tồi, nhưng không sao, đây là cách thực hiện điều đó một cách an toàn. Đầu tiên, tạo một khóa ngẫu nhiên và lưu trữ nó trong một hằng số.
Lưu ý rằng bạn đang làm thêm công việc và chỉ có thể sử dụng hằng số này làm chìa khóa và giúp bản thân đỡ đau lòng hơn! Sau đó, sử dụng PBKDF2 (giống như vậy) để lấy khóa mã hóa phù hợp từ mật khẩu của bạn thay vì mã hóa trực tiếp bằng mật khẩu của bạn.
Đừng chỉ sử dụng mật khẩu 16 ký tự. Khóa mã hóa của bạn sẽ bị hỏng một cách hài hước. 445 hữu ích 5 bình luận chia sẻ 5 bình luận chia sẻ |