Parolaların Şifrelenmesi
Önceki XXXII. Oylum - Şifrelemeyle İlgili İşlevler Sonraki
Parolaların Şifrelenmesi
char *crypt
(const char *anahtar,
 const char *tuz)
işlev
crypt işlevi parolayı, bir anahtar dizgesi ile aşağıda ne olduğu anlatıldığı gibi bir tuz karakter dizisi olarak alır ve başka bir tuz ile başlayan yazılabilir bir ASCII dizge döndürür. İşlevin çıktısından, onu üreten anahtar değerini bulmanın en iyi yolunun anahtar'ın gerçek değerini bulana kadar anahtar için tahminde bulunmak olduğuna inanılmaktadır.
tuz parametresi iki şey yapar. Öncelikle, hangi algoritmanın kullanılacağını seçer, MD5-temelli olanı mı yoksa DES-temelli olanı mı. İkinci olarak, parolaları içeren bir dosya üzerinde parola tahmin etmeye çalışan birilerine hayatı dar eder; tuz olmadan, bir davetsiz misafir crypt çalıştırarak ve sonucu dosyadaki parolalarla karşılaştırarak tahminde bulunabilir. tuz ile davetsiz misafir crypt'i her farklı tuz ile çalıştırmak zorunda kalır.
MD-5 temelli algoritma için, tuz $1$ dizgesi ile başlayan, en çok 8 karakterle devam eden ve $ ile ya da dizge sonu ile sonlandırılan bir dizgeden oluşmalıdır. crypt'in sonucu, eğer tuz bir ile bitmiyorsa tuzı takip eden bir $ ve bunu da izleyen ./0-9A-Za-z alfabesinden 22 karakterle devam eder, toplamda en çok 34 karakter olabilir. anahtar'deki her karakter anlamlıdır.
DES temelli algoritma için, tuz, ./0-9A-Za-z alfabesindeki iki karakterden oluşmalıdır ve crypt işlevinin sonucu bu iki karakteri takip eden aynı alfabeden 11 karakterle birlikte toplam 13 karakterden oluşur. anahtar değerinin sadece ilk 8 karakteri anlamlıdır.
MD5 temelli algoritmanın kullanışlı olan uzunluğu hakkında bir sınır yoktur ve daha güvenlidir. Bu nedenle DES temelliye nazaran tercih edilir.
Kullanıcı parolasını ilk girdiğinde, tuz rastgele yeni bir dizge olarak ayarlanmalıdır. Bir parolayı crypt'in önceki çağrısının sonucu ile doğrulamak için, önceki çağrının sonucunu tuz olarak geçirin.
Aşağıdaki kısa program crypt'in parola ilk kez girildiğinde nasıl kullanılacağına bir örnektir. Buradaki tuz üretiminin ancak kabul edilebilir olduğunu unutmayınız; bu makineler arasında eşsiz değildir ve bir çok uygulamada saldıran kişi kullanıcının parolasını ne zaman ayarladığı bilgisine erişemez.
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <crypt.h>

int
main(void)
{
  unsigned long seed[2];
  char salt[] = "$1$........";
  const char *const seedchars =
    "./0123456789ABCDEFGHIJKLMNOPQRST"
    "UVWXYZabcdefghijklmnopqrstuvwxyz";
  char *password;
  int i;

  /* (Hemen hemen) Rastgele tohum üret.
     Bundan daha iyi yapmalısınız. */
  seed[0] = time(NULL);
  seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);

  /* 'tohum karakter'leri yazılabilir karakterlere dönüştür. */
  for (i = 0; i < 8; i++)
    salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f];

  /* Kullanıcı parolasını oku ve şifrele. */
  password = crypt(getpass("Parola:"), salt);

  /* Sonuçları yaz. */
  puts(password);
  return 0;
}
Diğer yazılım bir parolanın nasıl doğrulanacağını göstermektedir. Kullanıcıya parola isteminde bulunur ve ekrana "Erişim onaylandı." basar; eğer kullanıcı GNU libc manual yazarsa.
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <crypt.h>

int
main(void)
{
  /* "GNU libc manual" değerinin haşlaması. */
  const char *const pass = "$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/";

  char *result;
  int ok;

  /* Kullanıcı parolasını oku ve beklenilen parolayı
     salt olarak geçirerek şifrele. */
  result = crypt(getpass("Parola:"), pass);

  /* Sonucu sına. */
  ok = strcmp (result, pass) == 0;

  puts(ok ? "Erisim onaylandi." : "Erisim reddedildi.");
  return ok ? 0 : 1;
}
char *crypt_r
(const char         *anahtar,
 const char         *tuz,
 struct crypt_data * veri)
işlev
crypt_r işlevi crypt ile aynı şeyi yapar, fakat ek bir parametre ile işlev sonucu için yer bulundurur, bu yüzden evresel (reentrant) olabilir. crypt_r ilk kez çağrılmadan önce veri sıfırlarla doldurularak ilklendirilmelidir.
crypt_r işlevi bir GNU oluşumudur.
crypt ve crypt_r işlevlerinin prototipleri crypt.h başlık dosyası içinde bulunur.
Önceki Üst Ana Başlık Sonraki
Parolaların Okunması Başlangıç DES Şifreleme
Bir Linux Kitaplığı Sayfası