1

Тема: Нащо потрібна сіль при хешуванні?

Вітаю. Хотів був використати алгоритм хешувення argon2 для хешування паролю, і знайшов приклад, де генерується та використовується при хашуванні випадкова сіль.

function getPass(password1: string) {
  crypto.randomBytes(32, function (err, salt) {
    if (err) throw Error();

    argon2i.hash(password1, salt).then((hash) => {
      console.log(hash, salt.toString(`hex`));
    });
  });
}

async function checkPass(
  hash: string,
  salt: string,
  password: string
): Promise<boolean> {
  return argon2i.verify(hash, password);
}

const salt = `5b9fb0de1f19008ec5e1870ec410006660bed269df2eddb39f52c8c1f5851b7f`;
const hash = `$argon2i$v=19$m=4096,t=3,p=1$W5+w3h8ZAI7F4YcOxBAAZmC+0mnfLt2zn1LIwfWFG38$ZYbs6HY9VNl3hIEThohNi18hKFiyej1c1KYmLZTJ6Sc`;

// getPass(`password`);

(async () => console.log(await checkPass(hash, salt, `password`)))();

Я думав, що сіль додається до пароля при хешуванні, аби хешувався не сам пароль, а пароль + випадкова сіль, але ж тоді, аби перевірити, чи хеш відповідає певному паролю, нам потрібно десь зберігати ту сіль, аби при перевірці додавати її до пароля?

В моєму кодові та сіль ніде явно не зберігається, і кожен раз вона різна, але верифікація того хешу та пароля проходе успішно, хоча при верифікації я ніде не використовую сіль, як таке може бути?

Подякували: leofun011

2 Востаннє редагувалося VTrim (15.08.2020 18:35:10)

Re: Нащо потрібна сіль при хешуванні?

Є динамічна сіль, вона може змішуватися з паролем різними способами,але записується в хеш таким чином, що виходить вірний декодинг.

Подякували: FakiNyan1

3

Re: Нащо потрібна сіль при хешуванні?

Є всілякі "зворотні" генератори, котрі постійно хешують дані і зберігають їх, щоб потім за хешем відразу дізнатися яких саме даних це відбиток.
Але якщо додати сіль, то сенсу від того сервісу менше нуля і ймовірність того, що злодій, який викачав вашу бд, дізнається, що ваш пароль «12345» ніяка. Певно одна із причин, нашо той хеш тре.

4

Re: Нащо потрібна сіль при хешуванні?

А можете геш показати?

5

Re: Нащо потрібна сіль при хешуванні?

геш

$argon2i$v=19$m=4096,t=3,p=1$G2sGAjPAJ3CAGFtrVYPWdv4kaaEaLBY0wMjbhsxddoI$3ICUvKEQ8RHxZSVtRugKMy5LoNFPIQZjGc6kOxWybhU

сіль

1b6b060233c0277080185b6b5583d676fe2469a11a2c1634c0c8db86cc5d7682

6

Re: Нащо потрібна сіль при хешуванні?

Гм...

>>> import base64
>>> s='1b6b060233c0277080185b6b5583d676fe2469a11a2c1634c0c8db86cc5d7682'
>>> b=bytearray(int(s[i:i+2],16) for i in range(0,len(s),2))
>>> b
bytearray(b"\x1bk\x06\x023\xc0\'p\x80\x18[kU\x83\xd6v\xfe$i\xa1\x1a,\x164\xc0\xc8\xdb\x86\xcc]v\x82")
>>> x=base64.b64encode(b)
>>> x
b'G2sGAjPAJ3CAGFtrVYPWdv4kaaEaLBY0wMjbhsxddoI='
>>> 

Десь я це вже бачив...

Подякували: leofun011

7

Re: Нащо потрібна сіль при хешуванні?

FakiNyan написав:
  return argon2i.verify(hash, password);

як таке може бути?

Ця функція добуває сіль з хешу і це погано. node-argon2

Подякували: Yola, FakiNyan2

8

Re: Нащо потрібна сіль при хешуванні?

У схожому форматі геші зберігаються в /etc/shadow. Ніхто не забороняє вирізати початок і зберегти деінде, в полі "геш" тримати лише кінець (власне, геш), а об'єднувати лише для передачі в функцію обчислення.

Подякували: leofun01, ping, FakiNyan3

9

Re: Нащо потрібна сіль при хешуванні?

koala написав:

Ніхто не забороняє вирізати початок і зберегти деінде ...

Допустимо. Але ж ось це

$argon2i$v=19$m=4096,t=3,p=1

вже явно непотріб, який служить жирною підказкою для нападника.

Подякували: ping, FakiNyan2

10 Востаннє редагувалося koala (15.08.2020 22:40:35)

Re: Нащо потрібна сіль при хешуванні?

Ні, це просто параметри алгоритму.
Вас же оце не лякає:
https://man7.org/linux/man-pages/man3/crypt.3.html

1   | MD5
2a  | Blowfish (not in mainline glibc; added in some
    | Linux distributions)
5   | SHA-256 (since glibc 2.7)
6   | SHA-512 (since glibc 2.7)

А тут замість однієї цифри - набір параметрів, який визначає конкретний алгоритм з родини. Якщо це щось і підкаже зламнику, то хіба що те, що не варто й намагатися ламати.

Подякували: FakiNyan1

11

Re: Нащо потрібна сіль при хешуванні?

koala написав:

набір параметрів, який визначає конкретний алгоритм з родини.

Ага, і ви пропонуєте зберігати всі ці параметри в базі стільки разів, скільки буде користувачів ?
Чи кожного разу вирізати хеш зі стрічки / додавати хеш до стрічки ?

12 Востаннє редагувалося koala (15.08.2020 23:10:30)

Re: Нащо потрібна сіль при хешуванні?

А, в цьому плані? Ну так, є певна надмірність. Але вона ж додає й гнучкості - якщо в певний момент буде вирішено змінити параметри чи сіль для нових користувачів, старих це не зачепить. Якщо гнучкість не потрібна, а зайві 40 байтів на користувача критичні - то в чому проблема порізати стрічку по останньому $?

Подякували: leofun01, FakiNyan2

13

Re: Нащо потрібна сіль при хешуванні?

З використанням argon2 будь-яке з двох рішень буде ущербне. Є сенс пошукати іншу бібліотеку для хешування паролів.

14 Востаннє редагувалося Yola (16.08.2020 02:12:21)

Re: Нащо потрібна сіль при хешуванні?

FakiNyan написав:

і кожен раз вона різна

щось я не бачу, щоб вона була у вас кожен раз різна. У вас геш заданий через константу. Ви ніде не викликаєте getPass, який мав називатись якось типу getPassHash.

РЕД: Власне, схоже на те, що відповідь у коментарі leofun'а. Геш зберігає в собі сіль.

15

Re: Нащо потрібна сіль при хешуванні?

leofun01 написав:

Ця функція добуває сіль з хешу і це погано. node-argon2

А чим це погано?

Подякували: leofun011

16

Re: Нащо потрібна сіль при хешуванні?

leofun01 написав:

З використанням argon2 будь-яке з двох рішень буде ущербне. Є сенс пошукати іншу бібліотеку для хешування паролів.

шооо? а це ще чому? Я думав, що аргон2 - то найкраща ліба для таких речей, спеціяльно гуглив складність зламу всіляких алгоритмів хешування

17

Re: Нащо потрібна сіль при хешуванні?

leofun01 написав:

З використанням argon2 будь-яке з двох рішень буде ущербне. Є сенс пошукати іншу бібліотеку для хешування паролів.

Якісь аргументи, окрім особистої ідіосинкразії, будуть наведені?
Бо виглядає це приблизно так (я далеко не певен, що цей параметр саме це означає):
$1$ - MD5, операція перемішування виконується фіксовані 32 рази - заслабкий
$2$ - SHA-2, операція перемішування виконується фіксовані 128 разів - ну так-сяк
$argon2$v=19$ - argon2, операція перемішування виконується 19*1024 рази, але можна й поміняти - НІ, ЦЕ ПРЯМА ПІДКАЗКА ЗЛАМНИКУ!!!!1111

Подякували: leofun011

18 Востаннє редагувалося leofun01 (16.08.2020 11:53:03)

Re: Нащо потрібна сіль при хешуванні?

Yola написав:

РЕД: Власне, схоже на те, що відповідь у коментарі leofun'а. Геш зберігає в собі сіль.

Власне, koala навіть показав як саме сіль потрапляє в хеш.

Yola написав:
leofun01 написав:

Ця функція добуває сіль з хешу і це погано.

А чим це погано?

Якщо ми будемо зберігати цей "хеш" повністю, в одному місці, і якщо нападник дістане його, то він дістане і хеш і сіль. А враховуючи купу інших параметрів, які теж зберігаються в "хеш"і та ще й в явному вигляді, то нападник зможе використати ту саму бібліотеку для брутфорсу. А це зводить на 0 всі переваги використання солі і цієї бібліотеки.

Метод перемішування пароля і солі має бути секретним. А функція

argon2i.verify

приймає "хеш" і пароль (за задумом авторів). Тут нема секрету. Нападнику не доведеться вгадувати як змішувати сіль і пароль, достатньо просто запустити повний перебір і трохи почекати, і якщо пароль не надто довгий, то пароль підбереться.

А тепер уявіть собі, що це пароль якогось адміна, і в адмінці можна додати код, який буде виконаний сервером, тоді нападник отримає контроль над сервером (як мінімум частково).

FakiNyan написав:
leofun01 написав:

будь-яке з двох рішень буде ущербне.

шооо? а це ще чому? Я думав, що аргон2 - то найкраща ліба для таких речей, спеціяльно гуглив складність зламу всіляких алгоритмів хешування

Як бачимо, не найкраща.
Є ще такий варіант: У всіх місцях, де функції бібліотеки очікують від вас пароля, передавати "суміш" пароля і солі (алгоритм змішування визначите самі), тоді це може бути секюрно. Але це буде гівнокодинг, я би таким не займався.

koala написав:

Якісь аргументи, окрім особистої ідіосинкразії, будуть наведені?
...
$argon2$v=19$ - argon2, операція перемішування виконується 19*1024 рази, але можна й поміняти - НІ, ЦЕ ПРЯМА ПІДКАЗКА ЗЛАМНИКУ!!!

Так, це пряма підказка. Не важливо скільки там операцій перемішування, якщо нам відомі:

  • хеш;

  • сіль;

  • алгоритм хешування;

  • алгоритм змішування* (якого просто нема, в даному випадку).

* - йдеться про змішування пароля і солі.

upd: точніше, змішування є (в самій бібліотеці), але воно не секретне, тому можна вважати, що його нема.

Подякували: FakiNyan1

19

Re: Нащо потрібна сіль при хешуванні?

leofun01 написав:

Є ще такий варіант: У всіх місцях, де функції бібліотеки очікують від вас пароля, передавати "суміш" пароля і солі (алгоритм змішування визначите самі), тоді це може бути секюрно. Але це буде гівнокодинг, я би таким не займався.

а як тоді робить, щоб було секюрно і не гівнокодинг?

Подякували: leofun011

20

Re: Нащо потрібна сіль при хешуванні?

leofun01 написав:

Метод перемішування пароля і солі має бути секретним

Ішов 2020 рік... Секретним має бути лише ключ. Усі частини алгоритму мають бути відкритими. Історій про "а у нас тут такий талановитий хлопчик, він алгоритм не гірше за професорів зробить, і знатимемо цей алгоритм лише ми" - купа, і досить часто це закінчувалося погано. Ну хто б міг припустити, що крутий таємний алгоритм змішування ефективно лишає від 8 бітів у байті лише 5, з усіма наслідками для складності підбору? А бувало, причому у досить серйозних фірм. Мені здавалося, що на таке перестали вестися у 1990-і - аж ні, і зараз є люди, які так думають.

Подякували: leofun01, Yola, 0xDADA11C73