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!