2011-09-02 78 views
6

Tôi làm việc trên một số công cụ mã hóa.Làm thế nào để tạo ra một IV an toàn cho mã hóa AES CBC?

  • tôi sử dụng AES 256 với chế độ CBC
  • tôi sử dụng OpenSSL

tôi biết những điều sau đây (source = wikipedia):

một vector initalization nên là:

  • Độc đáo: không được lặp lại cho bất kỳ thư nào được mã hóa bằng khóa đã cho
  • không thể đoán trước: một kẻ tấn công quan sát bất kỳ số thông điệp và IV của họ nên không có thông tin để dự đoán người tiếp theo với xác suất thành công lớn hơn 50% cho mỗi bit (ví dụ, không thể phân biệt từ ngẫu nhiên)

câu hỏi của tôi là thế nào để tạo ra một cách an toàn IV với OPENSSL và PHP? Tôi biết có một chức năng như vậy trong lib mcrypt (http://fr2.php.net/manual/fr/function.mcrypt-create-iv.php)

Tôi không tìm thấy bất cứ điều gì để làm điều này với OPENSSL (tạo ra duy nhất và không thể đoán trước IV).

+0

Bạn có đang xác thực mật mã của mình không? –

Trả lời

5

Sử dụng openssl_random_pseudo_bytes (tốt nhất là với tham số thứ hai được đặt thành biến hiện tại, bạn nên kiểm tra lại rằng nó đã được đặt thành TRUE). Điều này sẽ tạo ra IV với các đặc tính ngẫu nhiên thích hợp.

$wasItSecure = false; 
$iv = openssl_random_pseudo_bytes(16, $wasItSecure); 
if ($wasItSecure) { 
    // We're good to go! 
} else { 
    // Insecure result. Fail closed, do not proceed. 
} 

Hoặc, PHP 7 cung cấp random_bytes() đơn giản hơn nhiều.

+1

Làm cách nào để xác định độ dài thích hợp cho IV? – foochow

+2

Lưu ý rằng tham số tùy chọn thứ hai của openssl_random_pseudo_bytes là tham chiếu đến một biến. Giá trị của nó được đặt bởi openssl khi chuỗi được tạo được coi là "mã hóa mạnh". Xem http://www.openssl.org/docs/crypto/RAND_bytes.html – dod

+1

Đúng. Tham số thứ hai được truyền theo tham chiếu và sau khi cuộc gọi chỉ chứa đúng nếu thuật toán được sử dụng là mã hóa mạnh. Xem câu trả lời của tôi dưới đây với một ví dụ và cách sử dụng thích hợp. – techdude

2

Bạn có thể sử dụng openssl_random_pseudo_bytes (len, & crypto_stron).

Tham số đầu tiên là độ dài bạn muốn tính theo byte. Nếu bạn đang sử dụng điều này để sử dụng trong một trong các phương pháp ssl mở, bạn có thể sử dụng hàm openssl_cipher_iv_length (phương pháp) để có được độ dài chính xác cho phương pháp được sử dụng.

Tham số thứ hai, & crypto_strong, cho phép bạn chuyển vào biến boolean sẽ được đặt thành true hoặc false tùy thuộc vào việc thuật toán được sử dụng có an toàn về mặt mã hóa hay không. Sau đó bạn có thể kiểm tra biến này và xử lý nó đúng nếu biến trở lại sai. Nó sẽ không bao giờ xảy ra, nhưng nếu có thì bạn có thể sẽ muốn biết.

Dưới đây là một ví dụ về việc sử dụng thích hợp:

$method = 'aes-256-cbc'; 
$ivlen = openssl_cipher_iv_length($method); 
$isCryptoStrong = false; // Will be set to true by the function if the algorithm used was cryptographically secure 
$iv = openssl_random_pseudo_bytes($ivlen, $isCryptoStrong); 
if(!$isCryptoStrong) 
    throw new Exception("Non-cryptographically strong algorithm used for iv generation. This IV is not safe to use."); 

Để biết thêm thông tin xem:

1

Chỉ cần thoải mái hơn khi sử dụng cùng một nội dung mà Thomas đã kiện:

private function genIv() 
{ 
    $efforts = 0; 
    $maxEfforts = 50; 
    $wasItSecure = false; 

    do 
    { 
     $efforts+=1; 
     $iv = openssl_random_pseudo_bytes(16, $wasItSecure); 
     if($efforts == $maxEfforts){ 
      throw new Exception('Unable to genereate secure iv.'); 
      break; 
     } 
    } while (!$wasItSecure); 

    return $iv; 
} 
Các vấn đề liên quan