Zastanawiałem
się dlaczego wciąż saltowane są przestarzałe rodzaje hashy (MD5
– vB), wmawiane jest ludziom, że to uniemożliwi utrudni
odzyskanie hasła w razie wycieku bazy danych.
Czemu nie używa
się prostej metody używania kodowania informacji, a następnie
szyfrowania jej. Pomyślałem o tym przeglądając źródło base64:
function decode64(input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9+/=]/g, ""); do { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } while (i < input.length); return output; } |
Szyfr ten zwiększa długość danych na wejściu o ~30%, więc zwiększa znacząco poziom trudności szyfrowanego hasła (w przypadku wycieku bazy danych).
Z hasła, które ma 8 znaków:
tygrysek
base64, tworzy hasło które ma 12znaków, składa się z małych, dużych liter i znaku specjalnego:
dHlncnlzZWs=
Następnie wrzucenie tego na wejście do MD5 da wynik
d876121641a8db88842cf7ccb8a8e82d
Zwiększenie trudności hasła jest bardzo duże, hasła wydłużone zostają o 2/3, dodane/zmienione znaki z których się ono składa. Zaszyfrowana wersja hasła jest niesłownikowa, złamanie jej zajmie dużo więcej czasu i energii obliczeniowej używając metody brute-froce.
Znikoma jest trudność hasła “tygrysek“, natomiast by brute-forcem złamać wersję base64 trzeba przeszukiwać 12znakowe hasła używając dużych, małych liter, cyfr i znaków specjalnych co daje 75^12=31676352024078369140625 możliwości!
Programu używające algorytmu, który opisuje w tej metodzie używające do przeliczeń GPU, wielowątkowe CPU nie istnieją, więc o takie zabezpieczenie jest praktyczne, teoretyczne, a na dodatek banalne w implementacji w Twoim CMS.
Nawet jeśli baza danych zostanie wyciągnięta (głównie user+mail+pass), to i tak na niewiele się to zda, bo odzyskanie 10% haseł będzie wielkim wysiłkiem. A żeby poznać algorytm pełnego szyfrowania wymagany będzie dostęp do plików źródłowych!