2012-06-06 20 views
11

Tôi đang gặp sự cố với lớp mật mã của mình. Đôi khi nó rất nhanh. Đôi khi tuy nhiên nó là chậm. mã Im đang sử dụng như sauLớp mật mã và mcrypt_create_iv chậm ở lần

class Cipher { 
    private $securekey, $iv; 
    function __construct() { 
     $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/[email protected]',TRUE); 
     $this->iv = mcrypt_create_iv(32); 
    } 
    function encrypt($input) { 
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB)); 
    } 
    function decrypt($input) { 
     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB)); 
    } 
    function storeIV() { 
     return $this->iv; 
    } 
} 

Có bất kỳ gợi ý nào về việc tại sao điều này có thể chậm và đôi khi tôi có thể khắc phục điều này?

+0

Tải máy chủ như thế nào khi chạy nhanh? Khi nó chạy chậm? Bạn đã ghi lại những loại thời gian nào? – Crontab

+0

Tải máy chủ giống hệt nhau giữa tốc độ nhanh/chậm khi tải nhanh trong khoảng 0,5 giây khi nó chậm, tôi có thể đợi khoảng 2 phút – bretterer

+0

Chỉ cần lưu ý bảo mật: Tôi tin rằng bạn đang sử dụng lớp Mật mã để mã hóa nhiều bản rõ. Thông thường một iv không nên được tái sử dụng, vì vậy nó là tốt hơn tôi nghĩ rằng để tạo ra IV trong phương pháp mã hóa thay vì trong constructor. Xem http://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt để xem cách lưu trữ và khôi phục. Ngoài ra, lưu ý rằng mcrypt_create_iv có thể rất chậm nếu hệ thống không đủ entropy. Cá nhân tôi sử dụng openssl_random_pseudo_bytes. Ngoài ra, tôi nghĩ rằng có đối số iv mất tích trong các cuộc gọi hàm mcrypt_encrypt/decrypt của bạn. –

Trả lời

26

Bạn đã thử ba lập luận khác nhau thứ hai cho mcrypt_create_iv(): MCRYPT_RAND (hệ thống máy phát điện số ngẫu nhiên), MCRYPT_DEV_RANDOM (đọc dữ liệu từ/dev/random) và MCRYPT_DEV_URANDOM (đọc dữ liệu từ/dev/urandom)? Họ có cung cấp tốc độ phù hợp khác nhau không? Tôi tự hỏi nếu đó là bởi vì/dev/ngẫu nhiên (nguồn ngẫu nhiên mặc định) đang chạy ra khỏi entropy thu thập được; chức năng sẽ chặn khi nó hoạt động.

+0

Nếu đó là sau này, là có một giải pháp cho điều này hoặc chúng ta nên chỉ cần thay đổi để 'MCRYPT_DEV_URANDOM'? – Dan

+2

@ Silver89: chỉ cần thay đổi thành 'MCRYPT_DEV_URANDOM'. Theo Bruce Schneier, không phải/dev/random cũng không/dev/urandom rất mạnh (https://www.schneier.com/blog/archives/2013/10/insecurities_in.html), vì vậy bạn cũng có thể sử dụng hoạt động. – Crontab

+0

Tôi đã sử dụng 'MCRYPT_RAND' đã hoạt động. 'MCRYPT_DEV_URANDOM' cũng hoạt động. –

-1
class Cipher { 
    private $securekey, $iv; 
    function __construct() { 
     $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/[email protected]',TRUE); 
     $this->iv = isset($_SESSION['sifrem'])?$_SESSION['sifrem']:mcrypt_create_iv(34); 
     $_SESSION['sifrem']=$this->iv; 
    } 
    function encrypt($input) { 
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB)); 
    } 
    function decrypt($input) { 
     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB)); 
    } 
    function storeIV() { 
     return $this->iv; 
    } 
} 
+0

Bạn đã thay đổi điều gì? – Nightfirecat

+1

Nó không bao giờ là một ý tưởng tốt để tái sử dụng một IV, nó sẽ có tác động tiêu cực đến mức độ an toàn của nó. – Sam

6

Sử dụng MCRYPT_DEV_URANDOM khi tạo IV. Nó kém an toàn hơn, nhưng sẽ không chặn nếu entropy quá thấp. MCRYPT_DEV_RANDOM sẽ đợi cho đến khi đủ entropy được an toàn.

// PHP < 5.6 
$this->iv = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM); 

Nhưng trong các phiên bản cập nhật của PHP, mặc định đã thay đổi và mã ban đầu của bạn sẽ hoạt động.

// PHP >= 5.6 
$this->iv = mcrypt_create_iv(32); // MCRYPT_DEV_URANDOM implied 

PHP docs: mcrypt_create_iv(lưu ý trên tham số nguồn $):

Lưu ý rằng giá trị mặc định của tham số này là MCRYPT_DEV_RANDOM trước PHP 5.6.0.

Và từ Ubuntu Manual:

Nếu bạn không chắc chắn về việc liệu bạn nên sử dụng/dev/ngẫu nhiên hoặc/dev/urandom, sau đó có thể bạn muốn sử dụng sau này. Theo nguyên tắc chung,/dev/urandom nên được sử dụng cho mọi thứ ngoại trừ các khóa GPG/SSL/SSH kéo dài.

+1

Cảm xúc này được lặp lại và mở rộng trong [hướng dẫn sử dụng Ubuntu] (http://manpages.ubuntu.com/manpages/lucid/man4/random.4.html) - và tôi trích dẫn: "Nếu bạn không chắc chắn liệu bạn có nên sử dụng/dev/random hoặc/dev/urandom, có thể bạn muốn sử dụng sau. Theo quy tắc chung,/dev/urandom nên được sử dụng cho mọi thứ ngoại trừ các khóa GPG/SSL/SSH kéo dài. " –

Các vấn đề liên quan