(PHP 4, PHP 5, PHP 7, PHP 8)
crypt — Tek yönlü dizge aşlama
Bu işlev ikil dosyalarla çalışırken dosya içeriğini değiştirebilir.
$dizge
, string $tuz
= ?
) : string
crypt() işlevi standart Unix DES
şifreleme algoritmasını veya sistemdeki uygun algoritmalardan birini
kullanarak dizge
dizgesinin aşlanmış sürümünü
döndürür.
tuz
değiştirgesi isteğe bağlıdır. Bununla birlikte,
crypt() tuzsuz zayıf bir aş oluşturur ve bu durumda
bir E_NOTICE
seviyesinde bir hatası üretir. Daha iyi
güvenlik için yeterince güçlü bir tuz belirlemek gerekir.
password_hash() güçlü bir aş kullanır, güçlü bir tuz üretir ve uygun turları otomatik olarak uygular. password_hash() basit bir crypt() sarmalayıcısıdır ve mevcut parola aşlarıyla uyumludur. password_hash() kullanmak daha güvenlidir ve önerilir.
Aş türü tuz
değiştirgesiyle tetiklenir.
tuz
belirtilmemişse ya standart iki karakterlik (DES)
ya da MD5 şifrelemesinin varlığına bağlı olarak oniki karakterlik tuz otomatik
olarak üretilir. PHP, kullanılabilecek aşlar tarafından izin verilen geçerli
en uzun tuzu belirleyen CRYPT_SALT_LENGTH
adında bir
sabit içerir.
Standart DES şifrelemesinde crypt() işlevi tuz olarak çıktının ilk iki karakterini döndürür. Ayrıca, dizgenin sadece ilk sekiz karakterini kullanır, bu nedenle ilk sekiz karakteri aynı olan sekiz karakterden daha uzun dizgeler için tuz aynı olduğu sürece hep aynı sonucu üretir.
Desteklenen aş türleri:
CRYPT_STD_DES
- "./0-9A-Za-z" kalıbından
iki karakter içeren standart DES aşı. Tuzda geçersiz karakter kullanımı
işlevin başarısız olmasına sebep olur.
CRYPT_EXT_DES
- Dokuz karakterlik tuz kullanan
gelişkin DES aşı. "Tuz", bir alt çizginin ardından 4 baytlık yineleme
sayısı ve 4 baytlık tuzdan oluşan 9 karakterli bir dizedir. Bunlar
yazdırılabilir karakterler olup karakter başına 6 bit kullanılır ve en düşük
değerli karakter baştadır. 0 ila 63 arasındaki değerler "./0-9A-Za-z"
kalıbından kodlanmıştır. Tuzda geçersiz karakter kullanımı, işlevin
başarısız olmasına sebep olur.
CRYPT_MD5
- $1$ ile başlayan on iki karakterlik MD5
aşı.
CRYPT_BLOWFISH
- Tuzlu blowfish aşı şöyle oluşur:
"$2a$", "$2x$" veya "$2y$", iki basamaklı bir bedel değiştirgesi,
"$" ve "./0-9A-Za-z" kalıbından 22 karakter. Tuzda bu aralığın dışındaki
karakterlerin kullanılması, işlevin sıfır uzunluklu bir dize döndürmesine
sebep olur. İki basamaklı bedel değiştirgesi, temel Blowfish tabanlı
aşlama algoritması için yineleme sayımının 2'lik tabanda logaritmasıdır
ve 04-31 aralığında olmalıdır; bu aralığın dışındaki değerler işlevin
başarısız olmasına sebep olur. "$2x$" aşları görece zayıftır; "$2a$"
aşları uyumludur ve bu zayıflığı azaltır. Yeni aşlar için "$2y$"
kullanılmalıdır. İlgili güvenlik düzeltmesinin tüm ayrıntıları
» bu belgededir.
CRYPT_SHA256
- SHA-256 aşı, $5$ ile başlayan
onaltı karakterlik bir tuza sahiptir. Tuz dizesi 'rounds=<N>$'
ile başlıyorsa, N'nin sayısal değeri, Blowfish'teki bedel değiştirgesine
benzer şekilde, aşlama döngüsündeki tur sayısını belirtmek için
kullanılır. Öntanımlı tur sayısı 5000'dir, en az 1000 ve en çok
999.999.999'dur. Bu aralığın dışında bir N seçilirse en yakın sınır
değer kullanılır.
CRYPT_SHA512
- SHA-512 aşı, $6$ ile başlayan
onaltı karakterlik bir tuza sahiptir. Tuz dizesi 'rounds=<N>$'
ile başlıyorsa, N'nin sayısal değeri, Blowfish'teki bedel değiştirgesine
benzer şekilde, aşlama döngüsündeki tur sayısını belirtmek için
kullanılır. Öntanımlı tur sayısı 5000'dir, en az 1000 ve en çok
999.999.999'dur. Bu aralığın dışında bir N seçilirse en yakın sınır
değer kullanılır.
dizge
Aşlanacak dizge.
CRYPT_BLOWFISH
algoritmasının kullanımı,
dizge
değiştirgesinin 72 karakter uzunlukta
kırpılmasına sebep olur.
tuz
Aşlamaye göre değişen isteğe bağlı tuz dizgesi. Belirtilmezse, davranış algoritma gerçeklenimi tarafından tanımlanır ve beklenmedik sonuçlara yol açabilir.
Aşlama uygulanmış dizge veya 13 karakterden daha kısa olan ve başarısızlık durumunda tuzdan farklı olacağı garanti edilen bir dizge döndürür.
Parolalar doğrulanırken, crypt() çıktısını önceden bilinen aş ile karşılaştırmak için zamanlama saldırılarına açık olmayan bir dizge karşılaştırma işlevi kullanılmalıdır. PHP'de bu kullanım için hash_equals() işlevi bulunur.
Sürüm: | Açıklama |
---|---|
8.8.0 |
tuz değiştirgesi artık isteğe bağlı değil.
|
Örnek 1 - crypt() örnekleri
<?php
$aşlıParola = crypt('parolam');
// Tuzu PHP üretsin; önerilmez
/* Parola karşılaştırmasında, farklı şifreleme algoritmaları ile ilgili
sorunlardan kaçınmak için crypt() sonucunun tamamını tuz olarak işleve
aktarmalısınız. (Yukarıda belirtildiği gibi standart DES parola aşları
2 karakterlik tuz kullanırken MD5 parola özetleri 12 karakterlik tuz
kullanır.) */
if (hash_equals($özetliParola, crypt($kullanıcı_girdisi, $aşlıParola))) {
echo "Parola doğru!";
}
?>
Örnek 2 - htpasswd ile crypt() kullanımı
<?php
// Parolayı tanmılayalım
$parola = 'parolam';
// Tuzu PHP üretsin ve bize parola aşını versin
$hash = crypt($parola);
?>
Örnek 3 - crypt() işlevinin farklı aş türleri ile kullanımı
+/* Bu tuzlar sadece örnektir. Asla bire bir kullanılmamalıdır.
+ Her parola için ayrı üretilmiş, iyi biçimlenmiş bir tuz kullanılmalıdır.
+*/
+echo 'Standard DES: ',
+ crypt('rasmuslerdorf', 'rl'),
+ "\n";
+echo 'Gelişkin DES: ',
+ crypt('rasmuslerdorf', '_J9..rasm'),
+ "\n";
+echo 'MD5: ',
+ crypt('rasmuslerdorf', '$1$rasmusle$'),
+ "\n";
+echo 'Blowfish: ',
+ crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$'),
+ "\n";
+echo 'SHA-256: ',
+ crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$'),
+ "\n";
+echo 'SHA-512: ',
+ crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$'),
+ "\n";
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
Standart DES: rl.3StKT.4T8M Gelişkin DES: _J9..rasmBYk8r9AiWNc MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0 +Blowfish: $2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6 SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
Bilginize: crypt() tek yönlü algoritma kullandığından tekrar özgün dizgeyi elde etmenizi sağlayacak bir işlev yoktur.