Funkcją crypt() pod linuksem - MD5

0

Korzystając z dokumentacji http://linux.die.net/man/3/crypt chciałbym zahaszować jakiś tekst algorytmem MD5.
Wg dokumentacji ustawienie soli (salt) na $1$ powinno generować skróty MD5 zamiast szyfrować algorytmem DES.

Oto prosty kod:

#include <stdio.h>
#include <crypt.h>

int main() {
  
  char *passwd;
  char *salt;
  
  passwd = "beer";
  salt = "$1$";  //MD5

  printf("%s\n", crypt(passwd, salt));
  
  return 0;
}

Skrót MD5 dla beer powinien być: 3e1867f5aee83045775fbe355e6a3ce1 - 16 bajtów szesnastkowo
A mi wychodzi: P8qUEPaowhIZBaygKCcI// - 22 bajty znaków ASCII
3e(hex) to nie P
18(hex) to nie 8

Nic się nie zgadza. Co robię nie tak?

0

Nie używaj crypt do hashowania. Zamiast tego masz w OpenSSL całą gamę funkcji MD5_{Init, Update, Final}.

0
  1. #define _XOPEN_SOURCE       /* Patrz feature_test_macros(7) */
    #include <unistd.h>
    
    char *crypt(const char *key, const char *salt);
    
    #define _GNU_SOURCE         /* Patrz feature_test_macros(7) */
    #include <crypt.h>
    

Te define są ważne.

  1. crypt nie zwraca MD5
3

W sumie jak wyżej już zostało zasugerowane, do md5 lepiej użyć np. openssl lub np. implementacji z RFC (https://www.ietf.org/rfc/rfc1321.txt - na końcu dokumentu; można na sieci znaleźć te pliki wycięte i gotowe do użycia).

Ciekawsza jest natomiast odpowiedź na pytanie "czemu crypt nie nadaje się do MD5" (pomimo tego, iż w manie, tak jak napisałeś, jest wymieniony MD5). Odpowiedź jest trochę zaskakująca: crypt() owszem, używa MD5, ale nie zwraca samego hasza, a dość zabawnie skonstruowany hmac (bazujący na MD5), dodatkowo zakodowany zmodyfikowanym base64.

Więcej informacji można znaleźć np. na poniższym blogu:
https://www.vidarholen.net/contents/blog/?p=32

0

Dzięki wszystkim za pomoc. Użyłem openssl/md5.h i jest ok.

0

Ciekawsza jest natomiast odpowiedź na pytanie "czemu crypt nie nadaje się do MD5" (pomimo tego, iż w manie, tak jak napisałeś, jest wymieniony MD5). Odpowiedź jest trochę zaskakująca: crypt() owszem, używa MD5, ale nie zwraca samego hasza, a dość zabawnie skonstruowany hmac (bazujący na MD5), dodatkowo zakodowany zmodyfikowanym base64.

Co jeszcze ciekawsze, słyszałem opinie, że zrobiono tak właśnie dlatego, by uniemożliwić stosowanie ogólnodostępnych narzędzi łamiących hasła, itp.

0

Crypt(3) nie należy używać, bo pod spodem może siedzieć jakiś PBKDF albo inne cacko, które ma za zadanie spowolnić proces hashowania danych (czytaj: łamania siłowego). Koledze jak rozumiem po prostu chodziło o wyliczanie hasha. Dodatkowo OpenSSL potrafi być pod tym względem całkiem miło zoptymalizowany pod spodem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.