Mã hóa Base64 với muối PHP

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ữ

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õ

Cảnh báo. Các đoạn ví dụ trên trang này là dành cho mục đích minh họa. Đừng sử dụng chúng trong các dự án của bạn. Nếu bạn muốn một ví dụ trong thế giới thực để tham khảo, thay vào đó hãy xem các đoạn trích trong câu trả lời StackOverflow của Giám đốc phát triển của chúng tôi

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ì? .

hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
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í

  1. Nhà phát triển phải cung cấp bao nhiêu thông tin?
  2. Mục tiêu dự định là gì?
    • Bảo mật?
    • Sự toàn vẹn?
    • Tính xác thực?
    • Không bác bỏ? . )

Tổng quan về các khái niệm mật mã

Mã hóa Base64 với muối PHP

Quy tắc đầu tiên của mật mã. Đừng tự mình thực hiện

Việ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óa

Thuậ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

hash("sha256", "");
// e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

hash("sha256", "The quick brown fox jumps over the lazy dog");
// d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

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ể

hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be

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ật

Hầ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)

hash_hmac("sha256", "The quick brown fox jumps over the lazy dog", "secret key");
// 4a513ac60b4f0253d95c2687fa104691c77c9ed77e884453c6a822b7b010d36f

hash_hmac("sha256", "The quick brown fox jumps over the lazy cog", "secret key");
// ed6b9bc9d64e4c923b2cc19c15fff329f343f30884935c10e617e0fe067adef1

hash_hmac("sha256", "The quick brown fox jumps over the lazy dog", "secret kez");
// 291579f3123c3126df04a57f78768b6290df93f979b86af25fecd98a9811da5a

hash_hmac("sha256", "The quick brown fox jumps over the lazy cog", "secret kez");
// 298bb0244ebc987810de3892384bb4663742a540db2b3a875f66b09d068d1f64

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

Cảnh báo. Mã hóa không có xác thực tin nhắn dễ bị tấn công bằng bản mã đã chọn. Vui lòng đọc báo cáo trắng của chúng tôi trên

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à

hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
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à
hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
8). tôi. e.
hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
9 sẽ trả về một chuỗi byte ngẫu nhiên duy nhất cho một cặp
hash_hmac("sha256", "The quick brown fox jumps over the lazy dog", "secret key");
// 4a513ac60b4f0253d95c2687fa104691c77c9ed77e884453c6a822b7b010d36f

hash_hmac("sha256", "The quick brown fox jumps over the lazy cog", "secret key");
// ed6b9bc9d64e4c923b2cc19c15fff329f343f30884935c10e617e0fe067adef1

hash_hmac("sha256", "The quick brown fox jumps over the lazy dog", "secret kez");
// 291579f3123c3126df04a57f78768b6290df93f979b86af25fecd98a9811da5a

hash_hmac("sha256", "The quick brown fox jumps over the lazy cog", "secret kez");
// 298bb0244ebc987810de3892384bb4663742a540db2b3a875f66b09d068d1f64
0 và
hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
0 đã cho

Thậ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

hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
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).

Không có mã nào trên trang này là an toàn;

/**
 * This code is for example purposes only. DO NOT USE IT.
 * Use https://github.com/defuse/php-encryption instead
 * 
 * Demo: http://3v4l.org/ih8om
 */
bin2hex(
    openssl_encrypt(
      /* Message: */
        "The quick brown fox jumps over the lazy dog",
      /* Cipher algorithm and block mode: */
        'aes-128-ctr',
      /* Encryption key: (don't use weak keys like this ever, it's just an example!): */
        "\x01\x02\x03\x04" . "\x05\x06\x07\x08" . "\x09\x0a\x0b\x0c" . "\x0d\x0e\x0f\x10",
      /* Constant that means "don't encode": */
        OPENSSL_RAW_DATA,
      /* Initialization Vector or Nonce -- don't ever actually use all NULL bytes: */
        str_repeat("\0", 16) // This is a really bad way to generate a nonce or IV. 
    )
);
// 8f99e1315fcc7875325149dda085c504fc157e39c0b7f31c6c0b333136a7a8877c4971a5ce5688f94ae650

/**
 * This code is for example purposes only. DO NOT USE IT.
 * Use https://github.com/defuse/php-encryption instead
 * 
 * Demo: http://3v4l.org/ZgW38
 */
openssl_decrypt(
  /* Message: */
    hex2bin(
        "8f99e1315fcc7875325149dda085c504fc157e39c0b7f31c6c0b333136a7a8877c4971a5ce5688f94ae650"
    ),
  /* Cipher algorithm and block mode: */
    'aes-128-ctr',
  /* Encryption key: (don't use weak keys like this ever, it's just an example!): */
    "\x01\x02\x03\x04" . "\x05\x06\x07\x08" . "\x09\x0a\x0b\x0c" . "\x0d\x0e\x0f\x10",
  /* Constant that means "don't encode": */
    OPENSSL_RAW_DATA,
  /* Initialization Vector or Nonce -- don't ever actually use all NULL bytes: */
    str_repeat("\0", 16) // This is a really bad way to generate a nonce or IV.
);
// The quick brown fox jumps over the lazy dog

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

/**
 * This code is for example purposes only. DO NOT USE IT.
 * Use https://github.com/defuse/php-encryption instead
 */
$nonce = random_bytes(16);
$ciphertext = openssl_encrypt(
  /* Message: */
    "The quick brown fox jumps over the lazy dog",
  /* Cipher algorithm and block mode: */
    'aes-128-ctr',
  /* Encryption key: (don't use weak keys like this ever, it's just an example!)
   *    Instead, you want to generate 16, 24, or 32 random bytes (i.e. random_bytes(16))
   *    on your own. It's generally a bad idea to copy and paste security code.
   */
    "\x01\x02\x03\x04" . "\x05\x06\x07\x08" . "\x09\x0a\x0b\x0c" . "\x0d\x0e\x0f\x10",
  /* Constants that mean "don't encode" and "we have no padding" to the OpenSSL API: */
    OPENSSL_RAW_DATA + OPENSSL_ZERO_PADDING,
  /* Initialization Vector or Nonce: */
    $nonce
);
// You should choose a better HMAC key than we did for this article:
$mac = hash_hmac("sha256", $nonce.$ciphertext, "\xff\xfe\xfd\xfc" . "\xfb\xfa\xf9\xf8" . "\xf7\xf6\xf5\xf4" . "\xf3\xf2\xf1\xf0", true);
echo bin2hex($nonce.$ciphertext.$mac);
/*
   71b5546f 6cb857cd 0d8f8be3 f9312c74 <- Nonce (randomly chosen)
   356146df 274552c2 e98d3008 b1dfa35c <- Ciphertext
   60d6130d 9c9ca525 6c2f2f25 0b321176
   06563174 c3b073a0 5ab263
   4d1c7416 b086a316 a0474a05 84e3793c <- MAC
   a32fde09 0d82a5ef 213cb329 da3b5b06 
 */

Đ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

  • Mã hóa khóa bí mật cung cấp tính bảo mật sao cho nó chỉ có thể được đọc bằng khóa bí mật chính xác
  • Các hàm băm có khóa cung cấp xác thực (và do đó, tính toàn vẹn của thông báo) sao cho bất kỳ ai sở hữu khóa bí mật chính xác đều có thể tính toán lại cùng một MAC
  • IV/nonce ngẫu nhiên được sử dụng để làm cho mỗi tin nhắn được mã hóa là duy nhất, ngay cả khi tin nhắn không được mã hóa giống nhau

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 khai

Mậ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. )

Mã hóa Base64 với muối PHP

Đâ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

  • Mỗi người tham gia có một khóa riêng mà họ không bao giờ chia sẻ
  • Mỗi người tham gia cũng có một khóa công khai, có liên quan về mặt toán học với khóa riêng tư của họ mà họ chia sẻ với mọi người

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ó

  • Để sử dụng mật mã khóa công khai, bạn tạo một cặp khóa và chia sẻ khóa chung, nhưng giữ khóa riêng cho chính mình. (Trong hầu hết các trường hợp, mọi người tham gia đều làm điều này. )
  • Chỉ có một khóa riêng cho bất kỳ khóa chung nào
  • Cả hai khóa trong một cặp khóa nhất định đều có liên quan với nhau, về mặt toán học
  • Đưa ra một khóa chung, gần như không thể tìm ra khóa riêng là gì
  • Được cấp một khóa riêng, bạn có thể tính toán gần như ngay lập tức khóa chung có liên quan

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

  1. Bạn gửi cho cô ấy khóa công khai của bạn (màu vàng)
  2. Cô ấy gửi cho bạn khóa công khai của cô ấy (màu xanh nhạt)
  3. Kết hợp khóa riêng của bạn (màu xanh lá cây) và khóa chung của cô ấy (màu xanh lam) để tạo thành khóa bí mật dùng chung
  4. Cô ấy sẽ kết hợp khóa riêng của mình (màu đỏ) với khóa chung của bạn (màu vàng) để tạo thành cùng một khóa chia sẻ chính xác

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ẩu

Câ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à

hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
2 và
hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
3 thay vì
hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
4

Nhiề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

  • Nhanh
  • Chỉ có một đầu vào. Thông điệp
  • cố ý làm chậm
  • Ít nhất ba đầu vào
    1. Mật khẩu
    2. Một muối cho mỗi người dùng
    3. Một yếu tố chi phí (đắt như thế nào để thực hiện tính toán)

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ư

hash("sha256", "The quick brown fox jumps over the lazy cog");
// e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
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

Mã hóa Base64 với muối PHP

Đây rất có thể là chức năng lưu trữ mật khẩu tồi tệ nhất từng được viết

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

  • Thuật toán băm mật mã (e. g. SHA256) là thuật toán một chiều xác định yêu cầu khóa
    hash("sha256", "The quick brown fox jumps over the lazy cog");
    // e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
    
    6
  • Các thuật toán băm có khóa (e. g. HMAC) được sử dụng để xác thực trong mật mã khóa bí mật;
  • Thuật toán mã hóa khóa bí mật (e. g. AES-CTR) được sử dụng để chuyển đổi thông báo sao cho chỉ người sở hữu khóa bí mật mới có thể đảo ngược;
  • Các thuật toán thỏa thuận bí mật được chia sẻ (e. g. ECDH) được sử dụng để đàm phán khóa bí mật dùng chung trong khi chỉ yêu cầu truyền công khai khóa công khai của cả hai bên. Yêu cầu khóa
    hash("sha256", "The quick brown fox jumps over the lazy cog");
    // e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
    
    9 (hai cặp riêng tư/công khai) để tạo khóa thứ năm
  • Thuật toán chữ ký số (e. g. Ed25519) được sử dụng để ký tin nhắn (bằng khóa riêng của một người) mà bất kỳ ai sở hữu khóa chung tương ứng đều có thể xác thực. Yêu cầu phím
    hash_hmac("sha256", "The quick brown fox jumps over the lazy dog", "secret key");
    // 4a513ac60b4f0253d95c2687fa104691c77c9ed77e884453c6a822b7b010d36f
    
    hash_hmac("sha256", "The quick brown fox jumps over the lazy cog", "secret key");
    // ed6b9bc9d64e4c923b2cc19c15fff329f343f30884935c10e617e0fe067adef1
    
    hash_hmac("sha256", "The quick brown fox jumps over the lazy dog", "secret kez");
    // 291579f3123c3126df04a57f78768b6290df93f979b86af25fecd98a9811da5a
    
    hash_hmac("sha256", "The quick brown fox jumps over the lazy cog", "secret kez");
    // 298bb0244ebc987810de3892384bb4663742a540db2b3a875f66b09d068d1f64
    
    0
  • Thuật toán băm mật khẩu (e. g. bcrypt) là các thuật toán băm chậm được thiết kế đặc biệt để khó tấn công hiệu quả bằng tìm kiếm vũ phu. Yêu cầu đầu vào bí mật
    hash("sha256", "The quick brown fox jumps over the lazy cog");
    // e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be
    
    7 và muối cho mỗi người dùng
  • Thuật toán mã hóa (e. g. Base64) không phải là mật mã
  • Thuật toán nén (e. g. gzip) không phải là mã hóa

Ghi nhớ

  • Không mã hóa mật khẩu. Thay vào đó, hãy băm chúng bằng thuật toán băm mật khẩu. (Bạn có thể mã hóa các giá trị băm. ) Các hàm băm như MD5, SHA1 và SHA256 không phải là mã hóa. Bất cứ ai sử dụng cụm từ "mã hóa mật khẩu" có lẽ cần phải đọc kỹ toàn bộ trang này, bởi vì họ đã nhầm lẫn sâu sắc
  • Mã hóa khóa bí mật mà không có xác thực tin nhắn là không an toàn (nó dễ bị tấn công bằng bản mã đã chọn)
  • Để tải xuống. chữ ký số chứng minh tính xác thực, băm không. Bạn muốn có chữ ký Minsign hoặc GPG, không phải hàm băm MD5

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';