NAZWA¶
crypt, crypt_r - szyfrowanie danych i haseł
SKŁADNIA¶
#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>
char *crypt_r(const char *key, const char *salt,
struct crypt_data *data);
Proszę linkować z
-lcrypt.
OPIS¶
crypt to funkcja szyfrująca hasła. Opiera się ona na
algorytmie Data Encryption Standard, z pewnymi modyfikacjami mającymi
(między innymi) zapobiec próbom sprzętowego
złamania klucza.
Argument
key to hasło wpisane przez użytkownika.
Argument
salt to łańcuch dwóch znaków z
zestawu [
a-zA-Z0-9./]. Ten łańcuch umożliwia
kodowanie jednego hasła na 4096 różnych sposobów.
Poprzez pobranie 7 najmniej znaczących bitów pierwszych
ośmiu znaków łańcucha
key tworzony jest
56-bitowy klucz. Ten klucz jest używany do zakodowania z góry
ustalonego łańucha znaków (zwykle jest to
łańcuch składający się z samych zer).
Zwracana wartość wskazuje na zaszyfrowane hasło,
serię 13 znaków ASCII (pierwsze dwa znaki reprezentują
argument salt). Zwracana wartość wskazuje na statyczną
daną, która jest nadpisywana przy każdym wywołaniu
funkcji.
Uwaga: Istnieje 2**56 czyli 7.2e16, możliwych wartości.
Możliwe jest przeszukiwanie przestrzeni kluczy z użyciem
komputerów z przetwarzaniem równoległym. Dostępne
są programy, takie jak
crack(1), przeszukujące obszar
kluczy, które są często wykorzystywane przez ludzi jako
hasła. Tak więc hasło nie powinno zawierać
powszechnych wyrazów i nazw. Zalecane jest używanie programu
passwd(1), który podczas zmiany lub wyboru hasła
sprawdza, czy nie jest łatwe do złamania.
Sam algorytm DES ma kilka wad, dlatego
crypt() jest złym
rozwiązaniem dla zastosowań innych niż autoryzacja za
pomocą hasła. Jeśli planujesz wykorzystać
crypt() dla celów kryptograficznych, nie rób tego.
Zdobądź dobrą książkę o szyfrowaniu
i jedną z ogólnodostępnych bibliotek DES.
crypt_r() jest wielodostępową wersją
crypt().
Struktura wskazywana przez
data jest używana do przechowywania
wyniku i różnych wewnętrznych informacji. Oprócz
przydzielenia pamięci dla tej struktury, funkcja
wywołująca funkcję
crypt_r() powinna przed jej
pierwszym wywołanie ustawić
data->initialized na zero.
WARTOŚĆ ZWRACANA¶
W razie powodzenia zwracany jest wskaźnik do zaszyfrowanego hasła.
W przypadku wystąpienia błędu, zwracana jest
wartość NULL.
BŁĘDY¶
- EINVAL
- salt ma nieprawidłowy format.
- ENOSYS
- Funkcja crypt() nie została zaimplementowana, prawdopodobnie
ze względu na ograniczenia eksportowe Stanów
Zjednoczonych.
- EPERM
- /proc/sys/crypto/fips_enabled ma niezerową
wartość i próbowano użyć słabego
typu szyfrowania, takiego jak DES.
ATRYBUTY¶
Wielowątkowość (patrz pthreads(7))¶
Funkcja
crypt() nie jest bezpieczna dla wątków.
Funkcja
crypt_r() jest bezpieczna dla wątków.
ZGODNE Z¶
crypt(): SVr4, 4.3BSD, POSIX.1-2001.
crypt_r() jest rozszerzeniem
GNU.
UWAGI¶
Uwagi dotyczące biblioteki glibc¶
Wersja glibc2 tej funkcji obsługuje dodatkowe algorytmy szyfrowania.
Jeśli
salt jest łańcuchem znaków
zaczynającym się od "$
id$", po którym
następuje kolejny łańcuch znaków
kończący się na "$", to:
to zamiast używać DES,
id określa
używaną metodę kodowania, co wskazuje na sposób
interpretacji pozostałej części zakodowanego
hasła. Obsługiwane są następujące
wartości
id:
ID | Metoda |
|
|
1 | MD5 |
|
2a | Blowfish (nie w głównym glibc; dodane |
|
| w kilku dystrybucjach Linuksa) |
|
. |
|
. |
|
. |
|
. |
|
. |
|
. |
|
5 | SHA-256 (od glibc 2.7) |
|
6 | SHA-512 (od glibc 2.7) |
|
Tak więc $5$
salt$
encrypted jest hasłem zakodowanym
w SHA-256, a $6$
salt$
encrypted jest zakodowane w SHA-512
"
salt" oznacza do 16 znaków następujących
po "$
id$ w haśle. Zakodowana część
łańcucha znaków hasła jest właściwym
wyliczonym hasłem. Rozmiar tego łańcucha znaków
jest stały:
MD5 | 22 znaki |
|
SHA-256 | 43 znaki |
|
SHA-512 | 86 znaków |
|
Znaki w "
salt" i "
encrypted" są
losowane ze zbioru [
a-zA-Z0-9./]. W implementacjach MD5 i SHA
cały
key ma znaczenie (zamiast tylko pierwszych ośmiu
znaków, jak to jest w przypadku DES).
ZOBACZ TAKŻE¶
login(1),
passwd(1),
encrypt(3),
getpass(3),
passwd(5)
O STRONIE¶
Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux
man-pages. Opis projektu, informacje dotyczące zgłaszania
błędów, oraz najnowszą wersję
oryginału można znaleźć pod adresem
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Adam Byrtek (PTM) <abyrtek@priv.onet.pl>, Andrzej
Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, Robert Luberda
<robert@debian.org> i Michał Kułach
<michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu
manpages-pl; uwagi, pomoc, zgłaszanie błędów na
stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z
wersją
3.71 oryginału.