crypt
(PHP 4, PHP 5, PHP 7, PHP 8)
crypt — Tek yönlü dizge aşlama
Uyarı
Bu işlev ikil dosyalarla çalışırken dosya içeriğini
değiştirebilir.
Açıklama
PHP 8.0.0 öncesinde tuz
bağımsız değişkeni isteğe
bağlıydı. 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
bağımsız değişkeniyle 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 karakterlik yineleme
sayısı ve 4 karakterlik tuzdan oluşan 9 karakterli bir dizedir. Bu 4
karakterlik dizelerin herbiri 24 bitle kodlanı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 bağımsız değişkeni,
"$" 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 bağımsız değişkeni, 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.
-
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 bağımsız değişkenine
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 bağımsız değişkenine
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.
Bağımsız Değişkenler
dizge
-
Aşlanacak dizge.
Dikkat
CRYPT_BLOWFISH
algoritmasının kullanımı,
dizge
bağımsız değişkeninin 72 bayt uzunlukta
kırpılmasına sebep olur.
tuz
-
Aşlamaye göre değişen tuz dizgesi. Belirtilmezse,
davranış algoritma gerçeklenimi tarafından tanımlanır ve beklenmedik
sonuçlara yol açabilir.
Dönen Değerler
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.
Uyarı
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.
Örnekler
Örnek 1 - crypt() örnekleri
<?php
$kullanıcı_girdisi = 'rasmuslerdorf';
$aşlıParola = '$6$rounds=1000000$NJy4rIPjpOaU$0ACEYGg/aKCY3v8O8AfyiO7CTfZQ8/W231Qfh2tRLmfdvFD6XfHk12u6hMr9cYIA4hnpjLNSTRtUwYr9km9Ij/';
// Mevcut crypt() aşını PHP dışı yazılımlarla uyumlu olacak şekilde doğrula.
if (hash_equals($aşlıParola, crypt($kullanıcı_girdisi, $aşlıParola))) {
echo "Parola doğru!";
}
?>
Notlar
Bilginize:
crypt() tek yönlü algoritma kullandığından tekrar özgün
dizgeyi elde etmeyi sağlayacak bir işlev yoktur.