Format szyfrowania używany przez OpenSSL jest niestandardowy: jest „tym, co robi OpenSSL”, a jeśli wszystkie wersje OpenSSL zwykle się ze sobą zgadzają, nadal nie ma dokumentu referencyjnego, który opisuje ten format oprócz kodu źródłowego OpenSSL. Format nagłówka jest raczej prosty:
wartość magiczna (8 bajtów): bajty 53 61 6c 74 65 64 5f 5f wartość soli (8 bajtów)
Stąd ustalony 16-bajtowy nagłówek, zaczynający się od kodowania ASCII łańcucha „Solted__”, po którym następuje sama sól. To wszystko ! Brak wskazania algorytmu szyfrowania; powinieneś sam to śledzić.
Proces, w którym hasło i sól są zamieniane na klucz, a IV nie jest dokumentowany, ale spojrzenie na kod źródłowy pokazuje, że wywołuje on specyficzną dla OpenSSL funkcję EVP_BytesToKey () , która wykorzystuje niestandardową funkcję wyprowadzania klucza z kilkoma powtarzającymi się skrótami . Jest to niestandardowy i źle sprawdzony konstrukt (!), Który opiera się na funkcji skrótu MD5 o wątpliwej reputacji (!!); tę funkcję można zmienić w wierszu polecenia za pomocą nieudokumentowanej -md
flagi (!!!); „liczba iteracji” jest ustawiona przez enc
polecenie na 1 i nie można go zmienić (!!!!). Oznacza to, że pierwsze 16 bajtów klucza będzie równe MD5 (hasło || sól) i to wszystko.
To jest dość słabe! Każdy, kto wie, jak napisać kod na komputerze, może spróbować złamać taki schemat i będzie mógł „wypróbować” kilkadziesiąt milionów potencjalnych haseł na sekundę (setki milionów można osiągnąć za pomocą GPU). Jeśli używasz „openssl enc”, upewnij się, że twoje hasło ma bardzo wysoką entropię! (tj. wyższy niż zwykle zalecany; celuj przynajmniej na 80 bitów). A najlepiej nie używaj go wcale; zamiast tego wybierz coś bardziej niezawodnego ( GnuPG , podczas szyfrowania symetrycznego hasła, używa silniejszego KDF z wieloma iteracjami podstawowej funkcji skrótu).