21

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

Алгоритм хешування має бути відкритим, щоб в ньому можна було виявити недоліки. Усі частини алгоритму можуть бути відкритими, якщо код містить секретні дані (наприклад константи, як в багатьох CMS), які використовуються для змішування пароля.
Але весь код разом зі всіма даними (як лоґін і пароль до db) не мають бути відкритими. Бо інакше про яку безпеку може йти мова ?
Безпека сайту складається з кількох компонент, серед яких:

  • секрет в базі

  • секрет в коді

Якщо нападник отримає доступ до бази, то такий підхід утримає нападника від доступу до коду/файлів.

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

22

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

leofun01 написав:

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

Наскільки я розумію, то мета використання солі це не повне унеможливлення брутфорсу, а перетворення його на черепахофорс, тобто роблення його дуже повільним.

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

23 Востаннє редагувалося leofun01 (16.08.2020 14:50:38)

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

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

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

24

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

Yola написав:

Наскільки я розумію, то мета використання солі це не повне унеможливлення брутфорсу, а перетворення його на черепахофорс, тобто роблення його дуже повільним.

А якщо в коді є секрет і все зроблено правильно, то так, брутфорс перетворюється в безглузду трату часу.

25

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

Знайшов цю тему.

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

26

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

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

function getPass(password1: string) {
  crypto.randomBytes(32, async function (err, salt) {
    if (err) throw Error();
    const newSalt = salt.toString(`hex`);
    const newPassword = newSalt.slice(16) + password1 + newSalt.slice(0, 16);
    console.log({ newSalt }, newSalt.slice(16), newSalt.slice(0, 16), {
      newPassword,
    });
    const hash = await argon2.hash(newPassword);
    console.log({ hash });
  });
}

async function checkPass(
  hash: string,
  salt: string,
  password: string
): Promise<boolean> {
  const newPassword = salt.slice(16) + password + salt.slice(0, 16);
  return argon2.verify(hash, newPassword);
}

const salt = `4fd36d9cab5c22d1c23212298cbd6ffd4db210acf7be40a44df030c20c02e7ec`;
const hash = `$argon2i$v=19$m=4096,t=3,p=1$bd690DkcPHkd/B7TKyvFSg$ksS/LL5S4vWM9twwITkD197Dkwz8hliU5WKw2LZQOEo`;

// getPass(`password`);

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

27

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

А що робить salt.toString('hex'); ?
і чим він відрізняється від salt.toString(); ?

28

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

Взагалі, сіль повинна мати хорошу ентропію. А символи з [0-9a-f] виглядають як не дуже вдалий варіант. Але враховуючи довжину солі і специфічний алгоритм, може й нормально буде.
І ще ось цю частину

    const newPassword = newSalt.slice(16) + password1 + newSalt.slice(0, 16);

я би виніс в окрему функцію. І під час публікації вказував би параметри не такі як на хості.

29

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

leofun01 написав:

А що робить salt.toString('hex'); ?
і чим він відрізняється від salt.toString(); ?

hex переводе значення байтиків у 16-кову систему числення, а просто toString намагається представити оті байти у вигляді символів юнікоду, здається. І виходе ось таке

��MT�t7��0^���l�h�����h�b�\ns�Y
Подякували: leofun011

30

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

leofun01 написав:

Взагалі, сіль повинна мати хорошу ентропію. А символи з [0-9a-f] виглядають як не дуже вдалий варіант. Але враховуючи довжину солі і специфічний алгоритм, може й нормально буде.
І ще ось цю частину

    const newPassword = newSalt.slice(16) + password1 + newSalt.slice(0, 16);

я би виніс в окрему функцію. І під час публікації вказував би параметри не такі як на хості.

не зовсім зрозумів, що мається на увазі під хостом. Ви маєте на увазі, що просто треба замінити 16 на щось інше?

31

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

FakiNyan написав:

що мається на увазі під хостом.

Сервер, на якому розміщено сайт.

FakiNyan написав:

Ви маєте на увазі, що просто треба замінити 16 на щось інше?

Та може бути і 16, просто треба щоб це не було в публічному доступі, якщо на сервері реально використовується це значення.

Короче, можете не звертати увагу на це.

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