2015-04-07 27 views
5

Zamanlama saldırısından kaçınmak için password_verify()'un uzunluk-sabit zaman karşılaştırması kullanıp kullanmayacağına dair bilgi bulmaya çalışıyorum. ŞimdiPHP password_verify() ve yavaş eşittir karşılaştırması

, basit bir örnek:

$hash = '$2y$10$HH3906lfby7HOy1N3duQh.Kju.84ct6AcMZm2p/SYZsZSXuYWvvT.'; 

$startTime = microtime(TRUE); 
password_verify('rasmuslerdorf', $hash); 
$endTime = microtime(TRUE); 

$time = $endTime - $startTime; 

Bu her zaman, (this article göre uzunluk sabit 'zaman "Neden bu sayfada karma kodu içinde sağlamalarının farkı nedir' biraz farklı çıktı, üretir? " paragraf), bir hash almak için zamanlama saldırısında kullanılabilir. Bence bu sonuçlar biraz rastgele görünüyor, ama kesinlikle sabit değiller.

Soru, password_verify(), zamanlama saldırısından kaçınmak için uzunluk-sabit zaman karşılaştırması kullanıyor mu? Dokümanlar üzerinde hiçbir bilgi yok ve benim sığ deneyimim nedeniyle işlev işleme süresini iyi yorumlayamıyorum.

cevap

4

Kısa cevaba tam kaynak koduna göz atabilirsiniz

/* We're using this method instead of == in order to provide 
* resistance towards timing attacks. This is a constant time 
* equality check that will always check every byte of both 
* values. */ 
for (i = 0; i < hash_len; i++) { 
    status |= (ret->val[i]^hash[i]); 
} 

php'nin password_verify işlevinin bir alıntıdır: evet, öyle.

Uzun cevap: gerekli değil. buna gerek yok neden

anlamak için, dizeleri bakmak gerekir kıyaslanan: Aynı şifrenin 5 farklı sağlamalarının var

$2y$10$9JxHB8U1QKsLS/ynplKzm.iIO7f6gtTKYA61ppVuANYxWNCA5DW1S 
$2y$10$ILlWQrYyDJvHHkxcCgjm7OThLRAmMcTzsJOZOwjaSYiRUHq8LVYde 
$2y$10$8JfydDKUNbOeiybwZ9m.j.5TC8CBqkc3RZu2DX42A4dFNpNYPWfzm 
$2y$10$qeG.53lr9PVVGN4Yk.kSZuOMpfone5kINyWVpAf2gUXPseU2WdSzK 
$2y$10$nZUgPUwiXIvCJ9BY1wbtbuV5vH6yff9CNyumFsI/NN2eJmf20iec. 

. biçimi şöyledir:

$2y$10$saltsaltsaltsaltsaltsahashhashhashhashhashhashhashhas 

Şimdi, (zamanlama saldırıları çalışan olacaktır biri) uzak bir saldırgana, tuz bir sır. Ve onların deneyini yeniden kazandığımızda tuz aynı. Örneğin: Saldırgan parola "abc" çalışır

stored password "test": 
hash = $2y$10$9JxHB8U1QKsLS/ynplKzm.iIO7f6gtTKYA61ppVuANYxWNCA5DW1S 

ise içten password_verify()crypt("abc", hash) arayacak.

$2y$10$9JxHB8U1QKsLS/ynplKzm.iIO7f6gtTKYA61ppVuANYxWNCA5DW1S 
$2y$10$9JxHB8U1QKsLS/ynplKzm.FTYpGS/gNDw4SB6YD0wEtCSPgGvtPim 

Bildirim aynıdır tuz: Artık

$2y$10$9JxHB8U1QKsLS/ynplKzm.FTYpGS/gNDw4SB6YD0wEtCSPgGvtPim 

, yanına tarafından, bu iki sağlamalarının en tarafını bakalım: Hangi sonuçlanır? İlk .'a kadar olan her şeyin aynı olduğuna dikkat edin. Ayrıca saldırganın tuzun ne olduğu hakkında hiçbir fikri olmadığını farkedin.

Saldırganın zamanlama saldırısını karşılaştırabiliyor olsaydı, iyi olmazdı. Çünkü onlar tuzu bilmezler (ve bu yüzden hashın tuzdan yoksun olduğu zamandan beri zamanını boşa harcadığı sonucuna varırlar). Bu nedenle zamanlama güvenliği kesinlikle gerekli değildir.

Neden dahil edilir? Çünkü herkes hata yapar. Çünkü savunma derinliği iyi bir fikir.Çünkü bu analiz, hash ile ilgili hiçbir şeyin tuz olmadan yararlı olduğunu varsaymaktadır (örneğin: bcrypt'deki bir kusur pahasına dayalı karmaları önyarsa, bu yüzden tuzu bilmiyorsanız, tuş boşluğu 72^255'ten azaltılır).

Kısacası, sahip olmak için iyi bir şey ama kesinlikle gerekli değil ...

İlgili konular