Hướng dẫn dùng 256 7 trong PHP

Tôi cần một hàm PHP AES256_encode[$dataToEcrypt]để mã hóa $datathành AES-256 và một hàm khác AES256_decode[$encryptedData]làm ngược lại. Có ai biết những gì mã này nên có chức năng?

Có một sự khác biệt giữa mã hóa và mã hóa .

Bạn có thực sự cần AES-256? Tính bảo mật của AES-256 so với AES-128 không đáng kể lắm; bạn có nhiều khả năng gặp khó khăn ở lớp giao thức hơn là bị tấn công vì bạn đã sử dụng mật mã khối 128 bit thay vì mật mã khối 256 bit.

Quan trọng - Sử dụng Thư viện

  • gỡ bỏ / mã hóa php
  • PECL libsodium
  • Halit [libsodium wrapper, bây giờ ổn định]

Triển khai AES-256 Nhanh chóng và Bẩn

Nếu bạn quan tâm đến việc xây dựng của riêng bạn không phải vì lợi ích triển khai nó trong sản xuất mà là vì lợi ích giáo dục của riêng bạn, tôi đã bao gồm một mẫu AES256

/**
 * This is a quick and dirty proof of concept for StackOverflow.
 * 
 * @ref //stackoverflow.com/q/6770370/2224584
 * 
 * Do not use this in production.
 */
abstract class ExperimentalAES256DoNotActuallyUse
{
    /**
     * Encrypt with AES-256-CTR + HMAC-SHA-512
     * 
     * @param string $plaintext Your message
     * @param string $encryptionKey Key for encryption
     * @param string $macKey Key for calculating the MAC
     * @return string
     */
    public static function encrypt[$plaintext, $encryptionKey, $macKey]
    {
        $nonce = random_bytes[16];
        $ciphertext = openssl_encrypt[
            $plaintext,
            'aes-256-ctr',
            $encryptionKey,
            OPENSSL_RAW_DATA,
            $nonce
        ];
        $mac = hash_hmac['sha512', $nonce.$ciphertext, $macKey, true];
        return base64_encode[$mac.$nonce.$ciphertext];
    }

    /**
     * Verify HMAC-SHA-512 then decrypt AES-256-CTR
     * 
     * @param string $message Encrypted message
     * @param string $encryptionKey Key for encryption
     * @param string $macKey Key for calculating the MAC
     */
    public static function decrypt[$message, $encryptionKey, $macKey]
    {
        $decoded = base64_decode[$message];
        $mac = mb_substr[$message, 0, 64, '8bit'];
        $nonce = mb_substr[$message, 64, 16, '8bit'];
        $ciphertext = mb_substr[$message, 80, null, '8bit'];

        $calc = hash_hmac['sha512', $nonce.$ciphertext, $macKey, true];
        if [!hash_equals[$calc, $mac]] {
            throw new Exception['Invalid MAC'];
        }
        return openssl_decrypt[
            $ciphertext,
            'aes-256-ctr',
            $encryptionKey,
            OPENSSL_RAW_DATA,
            $nonce
        ];
    }
}

Sử dụng

Đầu tiên, tạo hai khóa [vâng, hai trong số chúng] và lưu trữ chúng bằng cách nào đó.

$eKey = random_bytes[32];
$aKey = random_bytes[32];

Sau đó, để mã hóa / giải mã tin nhắn:

$plaintext = 'This is just a test message.';
$encrypted = ExperimentalAES256DoNotActuallyUse::encrypt[$plaintext, $eKey, $aKey];
$decrypted = ExperimentalAES256DoNotActuallyUse::decrypt[$encrypted, $eKey, $aKey];

Nếu bạn không có random_bytes[], hãy lấy random_compat .

16 hữu ích 5 bình luận chia sẻ

Như Johannes Gorset đã chỉ ra, bài đăng của Thomas Ptacek từ Matasano Security giải thích tại sao các hàm băm đơn giản, đa năng như MD5, SHA1, SHA256 và SHA512 là những lựa chọn băm mật khẩu kém .

Tại sao? Chúng quá nhanh - bạn có thể tính toán ít nhất 1.000.000 MD5 băm một giây trên một lõi với một máy tính hiện đại, do đó, sức mạnh vũ phu là khả thi đối với hầu hết mật khẩu mọi người sử dụng. Và đó là ít hơn nhiều so với một cụm máy chủ bẻ khóa dựa trên GPU!

Ướp muối mà không kéo dài khóa chỉ có nghĩa là bạn không thể tính toán trước bảng cầu vồng, bạn cần xây dựng nó một cách đặc biệt cho loại muối cụ thể đó. Nhưng nó sẽ không thực sự làm cho mọi thứ khó khăn hơn nhiều.

Người dùng @Will nói:

Mọi người đang nói về điều này giống như họ có thể bị hack qua internet. Như đã nêu, việc giới hạn các nỗ lực khiến không thể bẻ khóa mật khẩu qua Internet và không liên quan gì đến hàm băm.

Họ không cần. Rõ ràng, trong trường hợp LinkedIn, họ đã sử dụng lỗ hổng SQL tiêm phổ biến để lấy bảng DB đăng nhập và bẻ khóa hàng triệu mật khẩu ngoại tuyến.

Sau đó, anh ta quay lại kịch bản tấn công ngoại tuyến:

Bảo mật thực sự phát huy tác dụng khi toàn bộ cơ sở dữ liệu bị xâm phạm và sau đó một hacker có thể thực hiện 100 triệu lần thử mật khẩu mỗi giây so với băm md5. SHA512 chậm hơn khoảng 10.000 lần.

Không, SHA512 không chậm hơn 10000 lần so với MD5 - nó chỉ mất khoảng gấp đôi. Mặt khác, Crypt / SHA512 là một quái thú rất khác, giống như đối tác BCrypt của nó, thực hiện việc kéo dài khóa , tạo ra một hàm băm rất khác với một muối ngẫu nhiên tích hợp và sẽ mất khoảng 500 đến 999999 lần để tính toán [kéo dài là điều chỉnh].

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Vì vậy, sự lựa chọn cho PHP là Crypt / Blowfish [BCrypt], Crypt / SHA256 hoặc Crypt / SHA512. Hoặc ít nhất là Tiền điện tử / MD5 [PHK]. Xem www.php.net/manual/en/feft.crypt.php

14 hữu ích 5 bình luận chia sẻ

Chủ Đề