Có rất nhiều lời khuyên về lập trình và bảo mật tồi trên Internet. Một số lời khuyên là không tốt vì tác giả cung cấp thông tin sai, một số vì nó nhấn mạnh tính chính xác hơn là rõ ràng và hầu hết mọi người đều bị lạc trong biệt ngữ Show
Nếu bạn cảm thấy rằng mật mã là một chủ đề kỳ lạ, phức tạp và hơi đáng sợ mà cảm xúc của bạn có thể được mô tả tốt nhất là thờ ơ (vào một ngày đẹp trời), chúng tôi hy vọng rằng khi bạn đọc xong trang này, bạn sẽ hiểu rõ
Hãy bắt đầu với một câu hỏi cơ bản. Chính xác thì một tính năng mật mã là gì? . 6Đào sâu hơn một chút. có rất nhiều thuật toán mật mã và chúng thường có thể được nhóm lại với nhau dựa trên hai tiêu chí
Tổng quan về các khái niệm mật mãQuy tắc đầu tiên của mật mã. Đừng tự mình thực hiệnViệc phát triển các tính năng mật mã tốt nhất là dành cho các chuyên gia. Bằng mọi cách, hãy thoải mái mày mò, nhưng đừng triển khai các thử nghiệm của bạn trong sản xuất hoặc chia sẻ chúng với các nhà phát triển khác, những người có thể triển khai chúng trong sản xuất Thay vào đó, hãy sử dụng thư viện mật mã cấp cao mà các chuyên gia đã kiểm tra. Theo liên kết để đọc các đề xuất thư viện mật mã PHP của chúng tôi Mã hóa không cần chìa khóaThuật toán đơn giản nhất để xem xét là hàm băm mật mã, chấp nhận một đầu vào và trả về một đầu ra có kích thước cố định xác định duy nhất
Khi sử dụng hàm băm mật mã được thiết kế tốt, chẳng hạn như BLAKE2 hoặc SHA256, bất kỳ thay đổi nào bạn thực hiện đối với thông báo sẽ dẫn đến kết quả băm khác biệt đáng kể
Các hàm băm đơn giản rất nhanh và mang tính xác định; . Bản thân chúng hầu hết hữu ích cho việc kiểm tra lỗi hoặc như một khối xây dựng cho các nguyên mẫu mật mã khác mà hầu hết các nhà phát triển sẽ không cần phát triển Các hàm băm mật mã là các phép biến đổi dữ liệu một chiều. Mặc dù bạn có thể dễ dàng tính toán đầu ra hàm băm (thường được gọi là thông báo tóm tắt) cho bất kỳ thông báo tùy ý nào, nhưng bạn không thể dễ dàng chuyển từ đầu ra hàm băm sang thông báo ban đầu Một số hàm băm (chẳng hạn như MD5) có bảo đảm bảo mật yếu hơn và kích thước đầu ra nhỏ hơn. Do đó, việc tính toán hai thông báo khác nhau sẽ tạo ra cùng một mã băm MD5 là điều gần như đơn giản. Mật mã khóa bí mậtHầu hết các thuật toán mật mã không đơn giản như hàm băm. Kết quả là, chúng hữu ích hơn rất nhiều và có thể cung cấp các đảm bảo an toàn hơn nữa, "Có, đầu ra này có thể được sao chép từ đầu vào này. " Do đó, chúng thường yêu cầu hai phần đầu vào. Tin nhắn và khóa bí mật. Khóa bí mật phải là một chuỗi byte ngẫu nhiên duy nhất mà cả người gửi và người nhận dự định đều biết và không ai khác biết Hàm băm có khóa - Xác thực thưHàm băm có khóa, chẳng hạn như HMAC, là một triển khai đặc biệt của hàm băm chấp nhận thông báo và khóa bí mật và tạo Mã xác thực thông báo (MAC)
Các hàm băm có khóa hữu ích hơn các hàm băm; . Do đó, nếu bạn truyền một tin nhắn và MAC cho một tin nhắn nhất định và không bao giờ truyền khóa bí mật, bạn có thể chắc chắn rằng tin nhắn đó là xác thực Mã hóa khóa bí mật
Chính thức, mã hóa là quá trình chuyển đổi có thể đảo ngược của một tin nhắn (được gọi là 7) và một khóa bí mật thành một chuỗi byte dường như ngẫu nhiên (được gọi là 8). tôi. e. 9 sẽ trả về một chuỗi byte ngẫu nhiên duy nhất cho một cặp 0 và 0 đã choThật không may, mã hóa khóa bí mật đơn giản (còn được gọi là chế độ ECB) không an toàn. Nếu bạn mã hóa cùng một khối (16 byte, đối với thuật toán mã hóa AES phổ biến) trong một thư có cùng khóa ở chế độ ECB, bản mã sẽ lặp lại Do đó, mã hóa khóa bí mật hiện đại thực sự chấp nhận nhiều hơn hai mẩu thông tin. Ngoài thông báo 7 và khóa bí mật, chúng còn yêu cầu một Vectơ khởi tạo duy nhất (IV, cho chế độ CBC) hoặc nonce (số được sử dụng một lần, cho chế độ CTR).
Một ví dụ sâu hơn và ít minh họa hơn (tạo IV đúng cách) có sẵn tại đây Để kiểm tra kỹ hơn về mã hóa khóa đối xứng với OpenSSL, hãy đọc Giải mã chỉ thành công nếu sử dụng cùng IV/nonce và khóa bí mật. Tuy nhiên, chỉ có khóa phải được giữ bí mật; Nếu bạn nhớ lại từ bài đăng trên blog trước đây của chúng tôi, Sử dụng mã hóa và xác thực đúng cách, bản thân mã hóa khóa bí mật dễ bị giả mạo trừ khi bạn kết hợp nó với xác thực Các chiến lược duy nhất được chứng minh là an toàn là hoặc luôn mã hóa trước, sau đó xác thực dữ liệu được mã hóa bằng MAC Nếu bạn đang theo cấu trúc Mã hóa-Sau đó-MAC, bạn muốn sử dụng hai khóa bí mật riêng biệt. Một cho mã hóa, một cho MAC. Nói cách khác, áp dụng hai phần trước với nhau
Điều quan trọng là phải thận trọng khi kết hợp các tính năng mật mã. Giao thức cơ bản của chúng tôi như đã viết ở trên không có tính năng dư thừa
Không cần phải nói, nhưng mã hóa kép hoặc xác thực kép khi bạn cần mã hóa được xác thực sẽ thật ngớ ngẩn Mật mã khóa công khaiMật mã khóa công khai là một thách thức đối với những người không có kỹ thuật để hiểu và thậm chí còn khó khăn hơn đối với những người có kỹ thuật để giải thích chính xác mà không khiến người đọc chìm trong toán học hoặc bỏ sót các điểm quan trọng. Kết quả cuối cùng thường là rất nhiều nhầm lẫn và đôi khi là hiểu sai. (Một khoảnh khắc giả tạo, nếu bạn muốn. ) Đây là tất cả những gì bạn cần biết ngay bây giờ. Không giống như mã hóa khóa bí mật, bao gồm một khóa bí mật duy nhất được giữ bởi cả hai bên, trong mật mã khóa công khai, mỗi người tham gia có hai khóa
Thật không may là thuật ngữ "khóa" từ mật mã khóa bí mật bị mắc kẹt khi mật mã khóa công khai được phát hiện, vì không có nhiều hệ thống vật lý tương tự trực quan với những gì đang diễn ra ở đây. Một số người đã cố gắng giải thích mật mã khóa công khai bằng cách sử dụng màu sắc hoặc giải thích chi tiết. Nếu bạn quan tâm đến các chi tiết thân mật, chúng tôi khuyên bạn nên sử dụng cả hai liên kết trong câu trước Đối với những người khác, nếu bạn có thể chấp nhận những tiền đề này, thì việc hiểu phần còn lại không khó
Hiểu rồi? Thỏa thuận khóa bí mật được chia sẻGiả sử bạn muốn nói chuyện với một người bạn qua Internet bằng mật mã khóa bí mật (nhanh hơn nhiều so với mật mã khóa công khai), nhưng bạn không muốn bất kỳ ai khác đọc được mật mã đó. Bạn và cô ấy chưa thỏa thuận về khóa bí mật. Bạn làm nó như thế nào? Đánh bóng các chi tiết tốt hơn (video màu ở trên giải thích khá rõ), đây là những gì bạn làm
Làm sao? Chữ ký sốCác thuật toán chữ ký số, chẳng hạn như EdDSA (Thuật toán chữ ký số đường cong Edwards), là một trong những cải tiến hữu ích nhất có được từ mật mã khóa công khai Chữ ký số được tính từ tin nhắn và khóa riêng. Các thuật toán trước đó (chẳng hạn như ECDSA) cũng yêu cầu bạn tạo một nonce ngẫu nhiên duy nhất cho mỗi thông báo, nhưng điều này đã được chứng minh là dễ bị lỗi trong thế giới thực Bất kỳ ai khác có bản sao khóa chung của bạn đều có thể xác minh rằng một thư cụ thể đã được ký bằng khóa riêng của bạn. Không giống như các hàm băm có khóa, quá trình xác minh này diễn ra mà không yêu cầu bạn tiết lộ khóa riêng của mình Lưu trữ mật khẩuCâu trả lời nhanh. Chỉ cần sử dụng bcrypt. Đối với các nhà phát triển PHP, điều này có nghĩa là 2 và 3 thay vì 4Nhiều nhà phát triển nghĩ rằng mật khẩu nên được mã hóa, nhưng điều này là sai. Mật khẩu nên được băm, không được mã hóa. Hơn nữa, đừng nhầm lẫn các thuật toán băm mật khẩu với các hàm băm mật mã đơn giản. Chúng không giống nhau Băm mật mã Băm mật khẩu
Không giống như băm mật mã, băm mật khẩu yêu cầu nhiều hơn một tham số đầu vào. Nhưng không giống như các thuật toán mã hóa, băm mật khẩu là phép tính cửa bẫy xác định một chiều. Cũng không giống như mã hóa khóa bí mật, muối không cần phải giữ bí mật; . Mục đích của một loại muối duy nhất cho mỗi người dùng là để ngăn chặn tính toán trước và làm cho mật khẩu đoán từ một danh sách băm đắt hơn Tôi có thể mã hóa hàm băm mật khẩu (bcrypt) của mình không? Đúng. Nếu bạn chạy ứng dụng web và cơ sở dữ liệu của mình trên các máy chủ phần cứng riêng biệt, điều này thực sự cung cấp khả năng bảo vệ đáng kể theo chiều sâu. Đó là lý do đằng sau thư viện password_lock của chúng tôi Chữ ký số có thể chứng minh tính xác thực, hàm băm mật mã không thể Có một phần không cần thiết người dùng kỹ thuật, khi tải xuống tệp thực thi từ một trang web, sẽ tính toán lại hàm băm MD5 hoặc SHA1 của tệp và so sánh nó với tệp được hiển thị trên trang web mà họ đã tải tệp xuống từ đó. Nếu khớp, họ sẽ thực thi tệp, hoàn toàn tin tưởng nội dung của tệp là chính hãng Nếu cả tệp và giá trị băm được lưu trữ trên cùng một máy chủ, thì đây là một sự lãng phí thời gian hoàn toàn lố bịch. Bất kỳ kẻ tấn công nào có thể thay đổi quá trình tải xuống của bạn cũng có thể thay thế các giá trị băm trên trang web. (Nếu tệp và hàm băm nằm trên các máy chủ riêng biệt, tình hình sẽ khác một chút, nhưng sự cải thiện không đủ quan trọng để đảm bảo tránh một giải pháp tốt hơn. ) Rốt cuộc, như chúng tôi đã nói ở trên, các hàm băm như MD5 và SHA1 tạo ra đầu ra có kích thước cố định xác định cho một đầu vào nhất định. Không có bí mật liên quan. Khi một giải pháp không tăng tính bảo mật nhưng khiến mọi người cảm thấy an toàn hơn, chúng tôi gọi đó là rạp hát an ninh Các hàm băm mật mã là nhà hát bảo mật trong tình huống này. Thay vào đó, bạn muốn có chữ ký điện tử Để cải thiện tính bảo mật, thay vì đăng mã băm MD5/SHA1, nhà cung cấp phần mềm có thể ký gói của họ bằng khóa riêng EdDSA và chia sẻ rộng rãi khóa công khai EdDSA của họ. Khi bạn tải xuống tệp, bạn cũng nên tải xuống chữ ký và sử dụng khóa công khai đã xác minh để kiểm tra xem đó có phải là xác thực không Ví dụ. Minisign Hàm băm có khóa cũng sẽ không hoạt động ở đây, vì bạn sẽ cần phân phối khóa bí mật để bất kỳ ai cũng có thể xác minh chữ ký. Nếu họ có khóa bí mật, họ có thể giả mạo chữ ký của chính mình cho thông điệp bị thay đổi độc hại (trong trường hợp này là tệp thực thi) Chữ ký số là cách tốt nhất để đạt được sự đảm bảo về tính xác thực của bản tải xuống. Băm MD5/SHA1 hầu như luôn vô dụng ở đây Mã hóa và nén không phải là mật mãLỗi phổ biến của người mới bắt đầu là sử dụng chức năng mã hóa, chẳng hạn như 5, để cố gắng làm xáo trộn thông tin. Hãy xem xét đoạn mã sau, được cung cấp trong một cuộc thảo luận trên LinkedIn về cách lưu trữ mật khẩu đúng cách trong ứng dụng web PHP
Rất nhiều nhà phát triển sẽ mã hóa hoặc nén thông tin và cho rằng giải pháp của họ cung cấp mức độ bảo mật giống như các tính năng mã hóa thực tế đơn giản vì đầu ra không thể đọc được bởi con người. nó không Các thuật toán mã hóa và nén đều là các phép biến đổi thông tin không cần khóa, có thể đảo ngược. Mã hóa chỉ định cách trình bày thông tin trong văn bản mà con người có thể đọc được. Nén cố gắng giảm đầu vào xuống càng ít không gian càng tốt. Cả hai đều hữu ích, nhưng chúng không phải là tính năng mã hóa
Ghi nhớ
Chúng tôi hy vọng rằng bài đăng này đóng vai trò là phần giới thiệu tốt về các khái niệm mật mã. Nhóm của chúng tôi xuất bản các bài đăng mới về mật mã, bảo mật ứng dụng và phát triển web bằng PHP từ 2 đến 5 lần mỗi tháng (thường là vào Thứ Sáu). Chúng tôi cũng cung cấp dịch vụ tư vấn công nghệ và đánh giá mã Làm cách nào để mã hóa trong base64 trong PHP?PHP. Hàm base64_encode() . Hàm base64_encode() là một hàm có sẵn trong PHP dùng để Mã hóa dữ liệu với MIME base64. MIME (Tiện ích mở rộng thư Internet đa năng) base64 được sử dụng để mã hóa chuỗi trong base64. Dữ liệu base64_encoded chiếm thêm 33% dung lượng so với dữ liệu gốc.
Base64 có thể được muối?Muối là khóa được biết trên máy chủ gửi và máy chủ nhận. Base64 có thể đảo ngược là để truyền dữ liệu tạo thành giao dịch. Máy chủ giao dịch mong đợi một thông báo Base64 được thêm muối .
Làm cách nào để mã hóa và giải mã base64 trong PHP?Hàm PHP được sử dụng để mã hóa Base64 là “base64_encode”, trong khi hàm được sử dụng để giải mã là “base64_decode” . Cả hai hàm này đều chấp nhận một tham số duy nhất. Hàm mã hóa lấy một chuỗi bình thường làm đầu vào, trong khi hàm giải mã lấy một chuỗi được mã hóa làm đầu vào.
Làm cách nào để mã hóa và giải mã ID trong PHP?php // ví dụ base64_encode()/base64_decode() $string = 'Mã hóa và giải mã mã PHP được mã hóa'; |