CRYPT(3) | Kütüphane İşlevleri | CRYPT(3) |
İSİM
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
BİLDİRİM
#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); |
AÇIKLAMA
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.
DÖNÜŞ DEĞERİ
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.
HATALAR
-
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 edilenprefix
için geçersiz ise;input
boyutusize
, talep edilen önekprefix
ile en küçük geçerli tuz için yeterli değil ise;input
NULL ise. -
ERANGE
-
crypt_ra
: sağlanan veri alanı boyutusize
, talep edilen aşlama algoritması için yeterli değilse.crypt_gensalt_rn
:output_size
, derlenensetting
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
: derlenensetting
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 vesetting
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 vesetting
MD5 temelli algoritmadan başka bir şey istiyorsa.
AŞLAMA YÖNTEMLERİ
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 :
-
Aday parolaların bir denemede birçok aşlama ile denenebilmesi.
-
Aday parolaların önceden aşlanmış listelerinin kullanılması.
-
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.
Geleneksel DES temelli
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
Genişletilmiş BSDI biçimi DES temelli
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)
FreeBSD biçimi MD5 temelli
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
OpenBSD biçimi Blowfish temelli (bcrypt)
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.
TAŞINABİLİRLİK
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.
ÖZNİTELİKLER
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 |
TARİHÇE
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.
HATA AYIKLAMA
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.
İLGİLİ BELGELER
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)
ÇEVİREN
* Özgün Belgenin Lisans ve Telif Hakkı bilgileri: * * Written and revised by Solar Designer <solar at openwall.com> in 2000-2011. * No copyright is claimed, and this man page is hereby placed in the public * domain. In case this attempt to disclaim copyright and place the man page * in the public domain is deemed null and void, then the man page is * Copyright (c) 2000-2011 Solar Designer and it is hereby released to the * general public under the following terms: * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. * * This manual page in its current form is intended for use on systems * based on the GNU C Library with crypt_blowfish patched into libcrypt.