2012-06-06 57 views
11

de yavaştır. Zaman zaman çok hızlı. Bazen de yavaştır. Im kullanarak kodşifre sınıf ve mcrypt_create_iv benim şifre sınıf ile bir sorun yaşıyorum zamanlarda

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

aşağıdaki gibidir bu zamanlarda yavaş olabilir neden üzerinde herhangi bir öneri var mı ve bunu nasıl ayarlayabiliriz? MCRYPT_RAND (sistem rasgele sayı üreteci) ve MCRYPT_DEV_URANDOMMCRYPT_DEV_RANDOM (/ rastgele dev/okunan veriler) (/ dev/urandom verileri okumak):

+0

hızlı çalıştığında gibi sunucu yükü nedir? Ne zaman yavaş çalışıyor? Ne zaman kayıt oldun? – Crontab

+0

Sunucu yükler hızlı arasındaki özdeş olmuştur/o yavaş olduğunda yaklaşık 0,5 saniyede yükleniyor hızlı yavaş, ben yaklaşık 2 dakika – bretterer

+0

Sadece bir güvenlik notu için bekleyebilir: Sana şifrelemek için Şifreleme sınıfını kullanırken inanıyoruz çoklu düz metin. Normal olarak, bir iv tekrar kullanılmamalıdır, bu yüzden IV'ün şifreli yöntemde oluşturucudan ziyade daha iyi olduğunu düşünüyorum. depolamak ve geri yüklemek nasıl olduğunu görmek için http://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt bakın. Ayrıca, sistem yeterli entropi yoksa mcrypt_create_iv'in çok yavaş olabileceğini unutmayın. Şahsen openssl_random_pseudo_bytes kullanıyorum. Ayrıca, mcrypt_encrypt/decrypt fonksiyon çağrılarınızda eksik olan iv argüman olduğunu düşünüyorum. –

cevap

26

Eğer mcrypt_create_iv() için üç farklı ikinci argüman denediniz mi? Farklı tutarlı hızlar sunuyorlar mı? Bunun sebebi,/dev/random (varsayılan rasgele kaynak) toplanmış entropiden yoksun olmasıdır; Bu işlev, işlevi engelleyecek.

+0

Eğer ikincisiyse, bunun için bir çözüm var mı yoksa sadece 'MCRYPT_DEV_URANDOM' olarak mı değiştirmeliyiz? – Dan

+2

Silver89 @: sadece MCRYPT_DEV_URANDOM' 'değiştirmek. Bruce Schneier'e göre ne/dev/random ne de/dev/urandom çok güçlü değil (https://www.schneier.com/blog/archives/2013/10/insecurities_in.html), bu işe yarıyor. – Crontab

+0

Kullanılan MCRYPT_RAND işlevini kullandım. MCRYPT_DEV_URANDOM da çalıştı. –

-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

Neyi değiştirdiniz? – Nightfirecat

+1

Bir IV'ü tekrar kullanmak iyi bir fikir değildir, ne kadar güvenli olduğunu olumsuz etkileyecektir. – Sam

6

kullanımlar MCRYPT_DEV_URANDOM IV oluşturma. Daha az güvenli, ama entropi çok düşük olduğunda engel olmaz. MCRYPT_DEV_RANDOM güvenli olmak için yeterli entropi elde edilene kadar bekleyecektir.

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

Ancak PHP'nin daha güncel sürümlerinde, varsayılan değer değişti ve orijinal kodunuz çalışmalıdır.

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

PHP docs: mcrypt_create_iv($ kaynak parametre üzerinde not):

Not Bu parametrenin varsayılan değeri 5.6.0 PHP MCRYPT_DEV_RANDOM öncesinde olduğu.

Ve Ubuntu Manual dan

: Eğer/dev/random veya/dev/urandom kullanmalıdır olmadığı konusunda emin değilseniz

, daha sonra muhtemelen ikincisi kullanmak istiyorum. Genel kural olarak, uzun ömürlü GPG/SSL/SSH anahtarları hariç her şey için/dev/urandom kullanılmalıdır.

+1

Bu duygu, [Ubuntu elkitabı] 'nda (http://manpages.ubuntu.com/manpages/lucid/man4/random.4.html) yankılandı ve genişletildi ve şöyle diyor: "Eğer sizden emin değilseniz/dev/random veya/dev/urandom kullanmalı, sonra muhtemelen ikincisini kullanmak istersiniz.Genel bir kural olarak,/dev/urandom uzun ömürlü GPG/SSL/SSH anahtarları hariç her şey için kullanılmalıdır. " –