crypt - parola ve veri şifrelemesi
crypt_r - parola ve veri şifrelemesi
crypt_rn - parola ve veri şifrelemesi
crypt_ra - parola ve veri şifrelemesi
crypt_gensalt - parola ve veri şifrelemesi
crypt_gensalt_rn - parola ve veri şifrelemesi
crypt_gensalt_ra - parola ve veri şifrelemesi
#include _XOPEN_SOURCE
#include <unistd.h>
- char *crypt
- (const char *key, const char * setting);
#include _GNU_SOURCE
#include <crypt.h>
- char *crypt_r
- (const char *key, const char * setting,
struct crypt_data * data);
#include _QW_SOURCE
#include <crypt.h>
- char *crypt_rn
- (const char *key, const char * setting, void
* data, int size);
- char *crypt_ra
- (const char *key, const char * setting, void
** data, int * size);
- char *crypt_gensalt
- (const char *prefix, unsigned long count,
const char * input, int size);
- char *crypt_gensalt_rn
- (const char *prefix, unsigned long count,
const char * input, int size, char output, int
output_size);
- char *crypt_gensalt_ra
- (const char *prefix, unsigned long count,
const char * input, int size);
crypt,
crypt_r,
crypt_rn ve
crypt_ra
işlevleri, bir tuz ve muhtemelen diğer
değişkenleri de aktarmak için kullanılan bir dizi
desteklenen yöntemden biriyle istendiği şekilde
anahtarın kriptografik aş işlevini hesaplar.
crypt_r,
crypt_rn ve
crypt_ra işlevleri
crypt’ten farklı olarak evrelidir. Bu işlevler
sonuçlarını ve muhtemelen özel verilerini, bir
uygulama tarafından kendilerine belirtilen
size boyutundaki bir
data alanına ve/veya dinamik olarak
ayırdıkları belleğe yerleştirir.
Bazı aşlama algoritmaları veri alanını,
çağrılar arasında hesaplanmış ara
değerleri önbelleğe almak için kullanabilir. Bu
sebeple, uygulamalar ilk kullanımdan önce veri
alanını doğru bir şekilde ilklendirmelidir.
crypt_r yalnızca
data->initialized’in
sıfırla ilklendirilmesini gerektirir;
crypt_rn ve
crypt_ra için tüm
data alanının
sıfırlarla doldurulması veya
crypt_ra durumunda
*
data’nın NULL olması gerekir. Eğer
crypt_ra, talep edilen aşlama algoritmasını NULL *
data veya yeterli olmayan *
size ile
çağrırırsa gerekli bellek dinamik olarak
realloc(3) ile ayrılır. Bu sebeple
crypt_ra,
*
data NULL olmadığında bir önceki
crypt_ra çağrısıyla veya
malloc(3)
ailesinden bir çağrıyla ayrılan bir alana
gösterici olmalıdır.
crypt_ra ile ayrılan
belleğin
free(3) ile serbest bırakılması
gerekir.
crypt_gensalt,
crypt_gensalt_rn, ve
crypt_gensalt_ra
işlevleri belirtilen
prefix öneki (aşlama
yöntemini belirler), yineleme sayısı
count
(seçilen yöntem destekliyorsa) ve aslında tuz olarak
kullanacak en fazla
size baytlık kriptografik değerlerden
oluşan
input girdisi ile diğer işlevlerde
setting olarak kullanılabilecek bir dizge derler. Eğer
yineleme sayısı
count 0 ise, düşük
bir öntanımlı seçilir. Rastgele baytlar
/dev/urandom’dan elde edilebilir.
crypt_gensalt_rn ve
crypt_gensalt_ra işlevleri
crypt_gensalt
işlevinden farklı olarak evrelidir.
crypt_gensalt_rn,
sonuçları
output_size baytlık
output
tamponuna yerleştirir.
crypt_gensalt_ra ise,
sonuçları için bellekte dinamik olarak yer
ayırır. Bu belleğin
free(3) ile serbest
bırakılması gerekir.
Başarılı bir şekilde
tamamlandığında
crypt,
crypt_r,
crypt_rn ve
crypt_ra işlevleri, gerçekte
kullanılan
setting’i ve aşlama işlevinin
yazdırılabilir kodlama değerini içeren bir dizgeye
gösterici döndürür. Dizgenin tamamı,
crypt,
crypt_r,
crypt_rn ve
crypt_ra’ya
yapılan çağrılarda
setting olarak,
crypt_gensalt,
crypt_gensalt_rn ve
crypt_gensalt_ra’ya yapılan
çağrılarda
prefix olarak doğrudan
kullanılabilir.
crypt’in hata durumundaki davranışları tam
olarak standartlaştırılmamıştır.
Bazı gerçeklemeler başarısız olamaz
(süreç ölmediği sürece; bu durumda
birşey döndürelemez), diğerleri NULL veya sabit
dizge döndürür. Çoğu gerçeklemeler
errno değişkenine atama yapmaz, bazıları
yapar. SUSv2, sadece NULL döndürülmesini ve
errno
değişkenine atama yapılmasını
geçerli bir davranış olarak belirtir ve olası tek
bir hatayı tanımlar:
ENOSYS, "işlevsellik bu
gerçeklenimde desteklenmiyor". Ne yazık ki, mevcut
çoğu uygulama
crypt’in NULL
döndürmesini işlemeye hazır değildir.
Aşağıdaki açıklama sadece
crypt ve
crypt_r’in bu gerçeklemesine ve
crypt_rn ile
crypt_ra işlevlerine karşılık gelir. Bu
davranış, standartlara, mevcut uygulamalara veya
gerçeklenimlere uygun olarak değişebilir.
crypt ve
crypt_r yalnızca geçersiz veya
desteklenmeyen bir
setting dizgesi
aktarıldığında başarısız
olabilir (ve dönebilir). Bu durumda
farklılığı garanti etmek için
uzunluğu 13 karakterden kısa ve
setting’den
farklı olan sihirli bir dizgeye gösterici
döndürür. Bu davranış hem yeni
parolaları tanımlarken hem de mevcut parola
aşlamalarına karşı kimlik
doğrulaması yaparken
crypt’in
başarısız olmayacağını kabul eden
eski uygulamalar için güvenlidir.
crypt_rn ve
crypt_ra işlevleri hatayı belirtmek için NULL
döndürür. Dört işlevin tümü,
hata olduğunda hata kodunu
errno’yu atar.
crypt_gensalt,
crypt_gensalt_rn ve
crypt_gensalt_ra
işlevleri,
setting için derlenen dizgeye bir
gösterici döndürür veya hata durumunda ise hata
errno değişkenine atanıp NULL
döndürülür.
- EINVAL
-
crypt, crypt_r, crypt_rn,
crypt_ra: setting geçersiz veya bu gerçekleme
tarafından desteklenmiyor;
crypt_gensalt, crypt_gensalt_rn, crypt_gensalt_ra:
prefix geçersiz veya bu gerçekleme tarafından
desteklenmiyorsa; count, talep edilen prefix için
geçersiz ise; input boyutu size, talep edilen
önek prefix ile en küçük geçerli
tuz için yeterli değil ise; input NULL ise.
- ERANGE
-
crypt_ra: sağlanan veri alanı boyutu
size, talep edilen aşlama algoritması için
yeterli değilse.
crypt_gensalt_rn: output_size, derlenen setting
dizgesini tutmak için çok küçükse.
- ENOMEM
-
crypt (sadece özgün glibc): (sonraki
çağrıların tekrar kullanacağı)
çıktı tamponu için bellek ayrılamazsa;
crypt_ra: *data NULL ise veya *size talep edilen
aşlama algoritması için yeterli değilse ve
realloc(3) başarılı olmazsa;
crypt_gensalt_ra: derlenen setting dizgesi için bellek
ayrılamazsa.
- ENOSYS
-
crypt (SUSv2): işlevsellik bu
gerçeklenimde desteklenmiyorsa;
crypt, crypt_r (sadece glibc 2.0’dan 2.0.1’e
kadar): crypt eklentisi derlenmediyse ve setting MD5 temelli
algoritmadan başka bir şey istiyorsa.
- EOPNOTSUPP
-
crypt, crypt_r (sadece glibc 2.0.2’den
2.1.3’e kadar): crypt eklentisi derlenmediyse ve
setting MD5 temelli algoritmadan başka bir şey
istiyorsa.
Gerçeklenen aşlama yöntemleri, özellikle depolama ve
kimlik doğrulama için kullanıcı
parolasını işlemeye yöneliktir. Diğer
birçok amaç için en iyi ihtimalle verimsizdir.
Parola aşlamanın, güçlü parolaların
yerine geçmediğini anlamak önemlidir. Parola
aşlamalarına erişebilen bir saldırganın,
aşlamaya karşı aday parolaları denemesi her zaman
mümkündür. Ancak, parola aşlama
yöntemlerinin sahip olabileceği bazı özellikler bu
anahtar arama saldırılarını biraz daha
zorlaştırır.
Tuz kullanan tüm aşlama yöntemleri aynı anahtar ile
birçok aşlama oluşturabilir. Tuzların
düzgün kullanımı bazı
saldırıları yenebilir, örneğin :
- 1.
- Aday parolaların bir denemede birçok
aşlama ile denenebilmesi.
- 2.
- Aday parolaların önceden
aşlanmış listelerinin
kullanılması.
- 3.
- Parolalardan birini gerçekten tahmin etmeden iki
kullanıcının (veya tek kullanıcıya ait
iki hesabın), aynı mı yoksa farklı parolalara
mı sahip olduğunu belirleyebilmek.
Anahtar arama saldırıları, çok sayıda aday
parolanın aşlama hesaplamalarına
bağlıdır. Bu nedenle, iyi bir parola aşlama
yönteminin hesaplama maliyeti fazla olmalıdır - fakat
tabii ki kullanışsız olmayacak kadar uzun değil.
crypt,
crypt_r,
crypt_rn ve
crypt_ra
arayüzlerinde gerçeklenen tüm aş yöntemleri
özellikle aday parolanın arama maliyetini artırmak
için temel kriptografik ilkelin birden çok yinelemesini
kullanır. Ne yazık ki, donanım iyileştirmelerinden
ötürü, sabit maliyete sahip aşlama
yöntemleri zamanla daha az güvenli hale geldi.
Tuzlara ek olarak, yeni parola aşlama yöntemleri
değişken yineleme sayısını kabul ediyor.
Bu, uyumluluğu korurken maliyetleri donanım
iyileştirmelerine uyarlamayı mümkün kılar.
Aşağıdaki aşlama yöntemleri
açıklanan arayüzlerle gerçeklenebilir.
Bu yöntem,
crypt işlevinin neredeyse tüm
gerçeklemelerinde desteklenir. Ne yazık ki, birçok
sınırlaması nedeniyle artık yeterli
güvenliği sunmuyor. Bu nedenle, parola
aşlamalarını başka sistemlere
taşımanız gerekmedikçe, yeni parolalar için
kullanılmamalıdır.
önek "" (boş dizge);
^[./0-9A-Za-z]{2} ile eşleşen dizge (bkz: regex(7))
Kodlama sözdizimi
[./0-9A-Za-z]{13}
Azami parola uzunluğu
8 (7 bitlik karakter kullanır)
Etkili anahtar uzunluğu
56 bite kadar
Aşlama boyutu
64 bit
Tuz boyutu
12 bit
Yineleme sayısı
25
Bu yöntem BSDI üzerinde kullanılır ve David
Burren’in FreeSec kütüphanesinin
kullanılması nedeniyle en azından NetBSD, OpenBSD ve
FreeBSD üzerinde de mevcuttur.
önek "_"
Kodlama sözdizimi
_[./0-9A-Za-z]{19}
Azami parola uzunluğu
sınırsız (7 bitlik karakter kullanır)
Etkili anahtar uzunluğu
56 bite kadar
Aşlama boyutu
64 bit
Tuz boyutu
24 bit
Yineleme sayısı
1 ila 2**24-1 (tek olmalıdır)
Aslen FreeBSD için geliştirilen Poul-Henning Kamp’ın
MD5 temelli parola aşlama yöntemidir. Unix benzeri
çoğu sistemde, Solaris 10 ve üstlerinde desteklenir,
resmi glibc’nin bir parçasıdır. Ana
götürüsü sabit yineleme
sayısıdır, bu da mevcut donanım için zaten
çok düşüktür.
önek "$1$"
Kodlama sözdizimi
\$1\$[^$]{1,8}\$[./0-9A-Za-z]{22}
Azami parola uzunluğu
sınırsız (8-bit karakter kullanır)
Etkili anahtar uzunluğu
sadece aşlama boyutuyla sınırlıdır
Aşlama boyutu
128 bit
Tuz boyutu
6 ila 48 bit
Yineleme sayısı
1000
bcrypt, aslen Niels Provos ve David Mazieres tarafından OpenBSD
için geliştirilmiştir ve FreeBSD ile NetBSD’nin
yeni sürümlerini, Solaris 10 ve üstlerini, birçok
GNU/*/Linux dağıtımında desteklenmektedir. Fakat
resmi glibc’nin parçası değildir.
Hem
bcrypt hem de BSDI biçimi DES temelli aşlama
yönteminde değişken yineleme sayısı sunulsa
da,
bcrypt daha da hızlı donanıma bile
ölçeklenebilir, yalnızca parola kırmaya
özgü bazı belirli iyileştirmelere izin vermez,
etkin anahtar boyutu sınırlamasına sahip değildir
ve parolalar için 8 bitlik karakter kullanır.
önek "$2b$"
Kodlama sözdizimi
\$2[abxy]\$[0-9]{2}\$[./A-Za-z0-9]{53}
Azami parola uzunluğu
72 (8 bitlik karakter kullanır)
Etkili anahtar boyutu
sadece aşlama boyutuyla sınırlıdır
Aşlama boyutu
184 bit
Tuz boyutu
128 bit
Yineleme sayısı
2**4 ila 2**99 (şu anki gerçeklenimler için 2**31)
bcrypt ile,
crypt_gensalt,
crypt_gensalt_rn ve
crypt_gensalt_ra işlevlerine aktarılan
count
değişkeni, asıl yineleme sayısının 2
tabanlı logaritmasıdır.
bcrypt aşlamaları, "$2a$" önekini
1997’den beri kullanıyordu. Ancak, 2011 senesinde crypt_blowfish
paketinde (1.0.4’e kadar olan sürümler dahil) 8 bitlik
parola karakterlerinin işlenmesini etkileyen bir gerçekleme
hatası bulundu. Hatayı düzeltmenin yanı
sıra, mevcut sistemlere yükseltme yöntemleri
sağlamak için iki yeni önek
tanıtıldı: hatayı tamamen yeniden tanıtan
"$2x$", 7 ve 8 bitlik karakterlerin doğru işlenmesini
güvenceleyen "$2y$". OpenBSD 5.5, crypt_blowfish’in
"$2y$" önekiyle aynı etkiyi gösteren
"$2b$" önekini tanıtmıştır ve
mevcut crypt_blowfish’te bunu desteklemektedir. Ne yazık ki,
"$2a$" önekinin 8 bitlik parola karakterleri
üzerindeki etkisi sisteme özgü olarak kabul edilmelidir.
Yeni parola aşlamaları üretilirken, "$2b$" ve
"$2y$" önekleri kullanılmalıdır. (Bu
tür aşlamaların, bu yeni önekleri desteklemeyen
bir sisteme aktarılması gerekirse önceden
oluşturulmuş aşlamaların aktarılan
kopyalarındaki önek "$2a$" olarak
değiştirilebilir.)
crypt_gensalt,
crypt_gensalt_rn ve
crypt_gensalt_ra
işlevleri, "$2x$" hariç (yeni aşlamalarda
kullanılmamalıdır) "$2b$", "$2y$", ve
"$2a$" öneklerini destekler.
crypt,
crypt_r,
crypt_rn,
crypt_ra işlevleri, bu dört öneki
de destekler.
Bir glibc 2.x sisteminde bu işlevlerden herhangi birini kullanan
yazılımların, libcrypt ile ilintilenmesi gerekir. Bununla
birlikte, birçok Unix benzeri işletim sistemi ve GNU C
Kitaplığının eski sürümleri,
libc’de
crypt işlevini içermektedir.
crypt
ve
crypt_r glibc-2.28’de
kaldırılmıştır.
crypt_r,
crypt_rn,
crypt_ra,
crypt_gensalt,
crypt_gensalt_rn ve
crypt_gensalt_ra işlevleri çok
taşınabilir değildir.
Desteklenen aşlama yöntemleri gerçeklenime
bağımlıdır.
Bu bölümde kullanılan terimlerin
açıklamaları
attributes(7) sayfasında
bulunabilir.
İşlev |
Öznitelik |
Değer |
crypt, crypt_gensalt
|
Evre Güvenliği |
ÇEG-hayır yarış:crypt |
crypt_r, crypt_rn, crypt_ra,
crypt_gensalt_rn, crypt_gensalt_ra
|
Evre Güvenliği |
ÇEG-evet |
Rotor temelli
crypt işlevi Sürüm 6 AT&T
UNIX’te göründü. "Geleneksel" DES
temelli
crypt ilk kez Sürüm 7 AT&T UNIX’te
göründü.
crypt işlevi SVID, X/OPEN uyumludur ve BSD 4.3 üzerinde
kullanılmaktadır.
crypt tarafından
döndürülen dizgelerin uyumlu sistemler arasında
taşınabilir olması gerekmez.
crypt_r GNU C Kütüphanesinden kaynaklanır. HP-UX ve
MKS Toolkit üzerinde de bir
crypt_r içerir fakat
tanım ve anlamsallığı farklıdır.
crypt_gensalt Openwall eklentisidir. Solaris 10 ve üstü de
bir
crypt_gensalt içerir fakat tanım ve
anlamsallığı farklıdır.
crypt_rn,
crypt_ra,
crypt_gensalt_rn ve
crypt_gensalt_ra işlevleri de Openwall eklentisidir.
crypt ve
crypt_gensalt işlevlerinin
dönüş değerleri sonraki
çağrılar tarafından üzerine yazılan
sabit tamponları gösterir. (Solaris’in son
sürümlerinde
crypt evreye özgü verileri
kullanır ve aslında evre güvenliklidir.)
Hata durumunda
crypt işlevinin diğer
gerçeklemelerinden döndürülen dizgeler, salt
okunur konumlarda tutulur veya yalnızca bir kez ilklendirilir, bu da
normalde göstericisi
crypt işlevinin
dönüş değeri olan tamponu sıfırlarla
doldurmaya çalışmayı her zaman emniyetsiz yapar,
aksi takdirde güvenlik açısından tercih
edilebilir. Uygulamanın çıktı tamponlarında
tam denetime (ve çoğu zaman özel verilerin bir
kısmı üzerinde de) sahip olduğu,
crypt_r,
crypt_rn veya
crypt_ra işlevlerinin
kullanılmasıyla bu sorundan kaçınılabilir.
Ne yazık ki bu işlevler,
crypt işlevinin
istenmeyen bu özelliğine sahip sistemlerde mevcut
değildir.
Evre güvenlikli
crypt_r kullanan uygulamalar,
crypt_data
yapısı için büyük alan (128 KB’den
fazla) ayırmaya ihtiyaç duyar. Her evre, bu
yapının ayrı bir örneğine ihtiyaç
duyar.
crypt_r arayüzü, ikil uyumluğu bozmadan,
büyük miktarda özel veri tutabilen bir aşlama
algoritmasının gerçeklenmesini imkansız
kılar.
crypt_ra, kullanılan aşlama
algoritması için gereken ayırma boyutunun dinamik olarak
arttırılmasına izin verir. Ne yazık ki
crypt_ra işlevi,
crypt_r işlevine göre daha
az taşınabilirdir.
Çok evreli uygulamalar veya evre güvenlikli olması gereken
kütüphane işlevleri
crypt_gensalt yerine
crypt_gensalt_rn veya
crypt_gensalt_ra
kullanmalıdır.
login(1),
passwd(1),
crypto(3),
encrypt(3),
free(3),
getpass(3),
getpwent(3),
malloc(3),
realloc(3),
shadow(3),
passwd(5),
shadow(5),
regex(7),
pam(8)
© 2004 Emin İslam Tatlı
© 2022 Fatih Koçer
Bu çeviri özgür yazılımdır:
Yasaların izin verdiği ölçüde
HİÇBİR GARANTİ YOKTUR.
Lütfen, çeviri ile ilgili bildirimde bulunmak veya çeviri
yapmak için
https://github.com/TLBP/manpages-tr/issues adresinde
"New Issue" düğmesine tıklayıp yeni bir
konu açınız ve isteğinizi belirtiniz.