PBKDF2 с HMAC в Java

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

Для этого я напишу в файле только хеш пароля. Более конкретно, я намерен написать хеш пароля и случайную соль, а также саму случайную соль, чтобы избежать использования радуги и таблиц поиска. Я также хочу использовать растяжение ключа с PBKDF2, чтобы сделать вычисление хеша вычислительно дорогим. Наконец, я хотел бы использовать алгоритм хеширования с ключом, HMAC, для конечного уровня защиты.

Я пытаюсь реализовать свои мысли в коде Java, и я нашел несколько примеров операций, которые я представил выше:

private static byte[] pbkdf2(char[] password, byte[] salt, int iterations, int bytes)
    throws NoSuchAlgorithmException, InvalidKeySpecException
{
    PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes * 8);
    SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    return skf.generateSecret(spec).getEncoded();
}

То, что я действительно не могу понять, это то, как ввести мой секретный ключ в качестве ключа, используемого алгоритмом HMAC, так как он не является входом для функции. Я просмотрел документацию по Java, но не могу найти решение своего вопроса.

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

1 ответ

Решение

Я думаю, что вижу замешательство. Вы, очевидно, ожидаете, что ваш код будет применять PBKDF2, а затем HMAC-SHA-1. Это не так: HMAC-SHA-1 используется внутри PBKDF2.

Суть PBKDF2 состоит в том, чтобы повторно применять функцию, которая имеет следующие свойства:

  • требуется два аргумента;
  • возвращает значение фиксированного размера;
  • он практически неотличим от псевдослучайной функции.

HMAC-SHA-1 - это такая функция и общий выбор. Существуют другие варианты PBKDF2, использующие HMAC-MD5, HMAC-SHA-256 или другие функции (но эти варианты отсутствуют в базовой библиотеке Java).

PBKDF2 принимает два ввода данных (плюс некоторые входы конфигурации): пароль и соль. Если вы хотите включить в вычисление секретное значение, вход PBKDF2 - это место для него: не прибегайте к пользовательской схеме поверх этого (создание собственного криптозащиты - это рецепт для того, чтобы делать это неправильно). Добавьте перец (секретное значение, общее для всех учетных записей) к соли (общедоступное значение, которое варьируется между учетными записями).

Обратите внимание, что перец имеет ограниченную полезность. Это полезно только в том случае, если хэши и секретное значение перца хранятся в разных местах, например, если хэши находятся в базе данных, а перчик находится в файле на диске, который напрямую не подвержен атакам SQL-инъекций.

Другие вопросы по тегам