Scroll to navigation

CRYPT(3) Library Functions Manual CRYPT(3)

NAZWA

crypt, crypt_r, crypt_rn, crypt_ramiesza (haszuje) hasła

BIBLIOTEKA

Crypt Library (libcrypt, -lcrypt)

SKŁADNIA

<crypt.h> char * (const char *phrase, const char *setting); char * crypt_r(const char *phrase, const char *setting, struct crypt_data *data); char * (const char *phrase, const char *setting, struct crypt_data *data, int size); char * (const char *phrase, const char *setting, void **data, int *size);

OPIS

Funkcje crypt, crypt_r, crypt_rn i crypt_ra nieodwracalnie „mieszają” (haszują) hasła w celu ich przechowywania w systemowej bazie danych haseł (shadow(5)), za pomocą kryptograficznej „metody mieszającej”. Wynik operacji zwany jest „skrótem hasła” lub po prostu „skrótem” („haszem”). Metody mieszania opisano w crypt(5).

setting kontrolują metodę mieszania, która ma zostać zastosowana i przekazują jej różne parametry, w szczególności losową „sól”, która zapewnia, że żadne dwa przechowywane skróty nie są takie same, nawet przy takich samych phrase.

Argument data do crypt_r jest strukturą typu struct crypt_data. Ma co najmniej następujące pola:

struct crypt_data {
    char output[CRYPT_OUTPUT_SIZE];
    char setting[CRYPT_OUTPUT_SIZE];
    char input[CRYPT_MAX_PASSPHRASE_SIZE];
    char initialized;
};

Po pomyślnym powrocie z crypt_r, skróty haseł trafią do output. Aplikacje są zachęcane (lecz nie jest to wymagane) do używania pól input i setting, w celu ich przekazania jako input phrase i setting do crypt_r. W ten sposób łatwiejsze będzie usunięcie wszystkich wrażliwych danych, które nie są już potrzebne.

Pole initialized musi wynosić zero przed pierwszym użyciu obiektu struct crypt_data w wywołaniu do (). Przed pierwszym użyciem, zaleca się wyzerowanie całego obiektu, a nie tylko initialized i nie jedynie pól udokumentowanych (oczywiście należy to zrobić przed przechowaniem czegokolwiek w setting i input).

Argument data do crypt_rn powinien również wskazywać na obiekt struct crypt_data, przy czym size powinno być rozmiarem tego obiektu, rzutowanym na int. Przy użyciu z crypt_rn, cały obiekt data (poza polami input i setting) musi być wyzerowany przed pierwszym użyciem; nie jest to jedynie zalecenie, jak ma to miejsce w przypadku crypt_r. Poza tym, pola tego obiektu mają te same zastosowania, co dla crypt_r.

Przy pierwszym wywołaniu do crypt_ra, data powinno być adresem zmiennej void * ustawionej na NULL, a size powinno być adresem zmiennej int ustawionej na zero. crypt_ra zaalokuje i zainicjuje obiekt struct crypt_data, za pomocą malloc(3) i zapisze jego adres i rozmiar do zmiennych, na które wskazują data i size. Można ich później użyć ponownie w kolejnych wywołaniach. Po tym, jak aplikacja ukończy mieszanie haseł, powinna zdealokować obiekt struct crypt_data za pomocą free(3).

WARTOŚCI ZWRACANE

Po pomyślnym zakończeniu, crypt, crypt_r, crypt_rn i crypt_ra zwracają wskaźnik do łańcucha kodującego zarówno skrót hasła jak i ustawienia, których użyto, do jego zakodowania. Łańcuch ten może posłużyć jako bezpośrednie setting w innych wywołaniach do crypt, crypt_r, crypt_rn i crypt_ra, oraz jako prefix w wywołaniach do crypt_gensalt, crypt_gensalt_rn i crypt_gensalt_ra. Będzie to łańcuch złożony wyłącznie z drukowalnych znaków ASCII i nie będzie zawierał białych znaków, ani znaków „:”, „;”, „*”, „!” i „\”. Więcej informacji o formacie skrótów haseł znajduje się w podręczniku crypt(5).

crypt umieszcza swój wynik w statycznej przestrzeni przechowywania, która będzie nadpisana w kolejnych wywołaniach crypt. Nie jest bezpieczne równoczesne wywoływanie crypt z wielu wątków.

crypt_r, crypt_rn i crypt_ra umieszczają swoje wyniki w polu output ich argumentu data. Można bezpiecznie wywoływać je równocześnie z wielu wątków, o ile tylko używane są różne obiekty data w każdym wątku.

Upon error, crypt_r, crypt_rn, and crypt_ra write an hash to the output field of their data argument, and crypt writes an invalid hash to its static storage area. This string will be shorter than 13 characters, will begin with a ‘*’, and will not compare equal to setting.

Po wystąpieniu błędu, crypt_rn i crypt_ra zwrócą pusty wskaźnik. crypt_r i crypt również mogą zwrócić pusty wskaźnik, mogą też zwrócić wskaźnik do nieprawidłowego skrótu, w zależności od konfiguracji libcrypt (opcja zwrócenia nieprawidłowego skrótu istnieje ze względu na kompatybilność ze starszymi aplikacjami, które zakładają, że crypt nie może zwrócić pustego wskaźnika; zob. UWAGI DOTYCZĄCE PRZENOŚNOŚCI niżej).

All four functions set errno when they fail. When the functions succeed, the value of errno is unspecified and must not be relied upon.

BŁĘDY

EINVAL
setting jest nieprawidłowe lub żądano nieobsługiwanej metody mieszania.
ERANGE
phrase jest zbyt długie (dłuższe niż CRYPT_MAX_PASSPHRASE_SIZE znaków; niektóre metody mieszania mogą mieć mniejsze limity).
Tylko crypt_rn: size jest zbyt małe dla metody mieszania zażądanej w setting.
ENOMEM
Nie udało się zaalokować wewnętrznej pamięci „scratch”.
Tylko crypt_ra: nie udało się zaalokować pamięci dla data.
ENOSYS lub EOPNOTSUPP
Mieszanie haseł nie jest obsługiwane w tej instalacji lub metoda mieszania zażądana w setting nie jest obsługiwana. Te statusy błędów nie są używane w tej wersji libcrypt, ale mogą wystąpić na innych systemach.

UWAGI DOTYCZĄCE PRZENOŚNOŚCI

crypt jest wymienione w POSIX, lecz crypt_r, crypt_rn i crypt_ra nie są częścią żadnego standardu.

POSIX nie określa żadnych metod mieszania, ani nie wymaga, aby skróty haseł były przenośne między systemami. W praktyce, skróty haseł są przenośne, o ile oba systemy obsługują daną metodę mieszania. Jednak zestaw obsługiwanych metod mieszania znacznie różni się między systemami.

The behavior of crypt on errors isn't well standardized. Some implementations simply can't fail (except by crashing the program), others return a null pointer or a fixed string. Most implementations don't set errno, but some do. POSIX specifies returning a null pointer and setting errno, but it defines only one possible error, ENOSYS, in the case where crypt is not supported at all. Some older applications are not prepared to handle null pointers returned by crypt. The behavior described above for this implementation, setting errno and returning an invalid hash different from setting, is chosen to make these applications fail closed when an error occurs.

Z powodów historycznych ograniczeń, dotyczących eksportu oprogramowania kryptograficznego ze Stanów Zjednoczonych, crypt jest opcjonalną częścią POSIX. Aplikacje powinny być dlatego przygotowane do sytuacji, gdy crypt nie jest dostępne, bądź zawsze zawodzić (ustawiając errno na ENOSYS) przy rozruchu.

POSIX określa, że crypt jest zadeklarowane w <unistd.h>, lecz tylko gdy makro _XOPEN_CRYPT jest zdefiniowane i ma wartość większą lub równą zero. Ze względu na to, że libcrypt nie zapewnia <unistd.h>, deklaruje w zamian crypt, crypt_r, crypt_rn i crypt_ra w <crypt.h> .

Na mniejszości systemów (głównie ostatnich wersjach Solarisa), crypt używa statycznego bufora przechowywania przypisanego wątkowi, który czyni bezpiecznym równoczesne wywoływanie z wielu wątków, lecz nie zapobiega każdemu wywołaniu z wątku, przed nadpisaniem wyników poprzedniego wywołania.

USTERKI

Niektóre implementacje crypt, przy błędzie zwracają nieprawidłowy skrót, który jest przechowywany w położeniu tylko do odczytu, lub zainicjowanym jedynie jednokrotnie, co oznacza, że wyczyszczenie bufora, na który wskazuje wartość zwracana przez crypt jest bezpieczne tylko wtedy, gdy nie wystąpił błąd.

struct crypt_data może być dość duże (32kB w tej implementacji libcrypt; ponad 128kB w niektórych innych implementacjach). Jest to na tyle duża wielkość, że może być nierozsądne alokowanie jej na stosie.

Niektóre ostatnio zaprojektowane metody mieszania potrzebują jeszcze więcej pamięci „scratch”, lecz interfejs crypt_r nie umożliwia zmiany rozmiaru struct crypt_data bez złamania kompatybilności binarnej. Interfejs crypt_rn mógłby dokonywać większych alokacji dla określonych metod mieszania, lecz wywołujący crypt_rn nie ma sposobu określenia, jak dużo pamięci zaalokować. crypt_ra sam alokuje pamięć, lecz może wykonać jedynie pojedyncze wywołanie do malloc(3).

ATRYBUTY

Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).

Interfejs Atrybut Wartość
crypt Bezpieczeństwo wątkowe MT-niebezpieczne race:crypt
crypt_r , crypt_rn , crypt_ra Bezpieczeństwo wątkowe MT-bezpieczne

HISTORIA

Funkcja crypt oparta na wirnikach pojawiła się w Version 6 AT&T UNIX. „Tradycyjne” crypt, oparte na DES, pojawiło się w Version 7 AT&T UNIX.

crypt_r pochodzi z biblioteki GNU C. Występuje również funkcja crypt_r na HP-UX i MKS Toolkit, lecz prototypy i zachowanie różnią się.

crypt_rn i crypt_ra pochodzą z projektu Openwall.

ZOBACZ TAKŻE

crypt_gensalt(3), getpass(3), getpwent(3), shadow(3), login(1), passwd(1), crypt(5), passwd(5), shadow(5), pam(8)

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Adam Byrtek <alpha@irc.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Michał Kułach <michal.kulach@gmail.com> i Robert Luberda <robert@debian.org>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net

11 października 2017 r. Projekt Openwall