PBKDF2WithHmacSHA512 Vs. PBKDF2WithHmacSHA1

Я работаю над подсистемой аутентификации Java, которая определяет хранение паролей в БД как PBKDF2сгенерированные хеши, и теперь я пытаюсь решить, должен ли я использовать SHA1 или SHA512 как PFR. Я прошел через спецификации обоих, но они очень математически интенсивны для меня, чтобы следовать. Может ли кто-нибудь с лучшим крипто-пониманием объяснить, как PBKDF2WithHmacSHA512 отличается от PBKDF2WithHmacSHA1?

вот что я пытаюсь сделать:

private static final int HASH_BYTE_SIZE = 64; // 512 bits
private static final int PBKDF2_ITERATIONS = 1000;      

// generate random salt
SecureRandom random = new SecureRandom();
byte salt[] = new byte[SALT_BYTE_SIZE]; // use salt size at least as long as hash
random.nextBytes(salt);

// generate Hash
PBEKeySpec spec = new PBEKeySpec(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); // we would like this to be "PBKDF2WithHmacSHA512" instead? What Provider implements it?
byte[] hash = skf.generateSecret(spec).getEncoded();

// convert hash and salt to hex and store in DB as CHAR(64)...

2 ответов


давайте разбить слово по частям:

PBKDF2--WithHmac--SHA512

давайте пройдемся по частям

  • PBKDF2 с

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

  • HMAC

    расшифровывается как Keyed-Hash Message Authentication Code (HMAC) - специфическая конструкция для вычисления кода аутентификации сообщения (MAC) с использованием криптографической хэш-функции в сочетании с секретным криптографическим ключом. Любая криптографическая хэш-функция может использоваться при расчете HMAC; полученный алгоритм MAC называется HMAC-MD5 или HMAC-SHA1 соответственно.

  • криптография SHA512

    Ну, вы знаете об этом.. : P

теперь, возвращаясь к вашему вопросу, строку кода:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

указывает keyFactory для использования алгоритма PDBKDF2WithHmacSHA1. Когда вы бы сделали что-то вроде:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");

вы говорите фабрике использовать алгоритм PBDKF2WithHmacSHA512.

Essentialy основное различие между PBKDF2WithHmacSHA1 и PBKDF2WithHmacSHA512 это:

  1. на PBKDF2WithHmacSHA1 будет произведите длину хэша 160 бит.
  2. на PBKDF2WithHmacSHA512 будет произведите длину хэша 512 бит.

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

дополнительная информация о двух алгоритмы:

  1. HMACSHA1

    hmacsha1-это тип хэш-алгоритма с ключом, который построен из хэш-функции SHA1 и используется в качестве HMAC или хэш-сообщения код аутентификации. Процесс HMAC смешивает секретный ключ с данные сообщения, хэши результат с хэш-функцией, смешивает это значение хэш-функции с секретным ключом, а затем применяет хэш функция во второй раз. Выход хэш-160 кусочки в длину.

  2. HMACSHA512

    HMACSHA512-это тип хэш-алгоритма с ключом, который построен из хэш-функция SHA-512 и используется в качестве хэш-сообщения Код аутентификации (HMAC). Процесс HMAC смешивает секретный ключ с данные сообщения и хэши результата. Хэш-значение смешивается с снова секретный ключ,и снова хеш. Выход хэш составляет 512 бит длина.

главным преимуществом является то, что HmacWith512 является более безопасным, чем HmacWith256. Например,

HMAC_SHA1("key","The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9

HMAC_SHA512("key","The quick brown fox jumps over the lazy dog") = 0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a

разница огромная (как видно). Надеюсь, это поможет. :)

EDIT: как упоминает OP

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)

параметр keyLength используется для указания предпочтения длины ключа для переменной-ключа-размер шифры. Фактический размер ключа зависит от реализации каждого поставщика. Следовательно, говорить, делать что-то вроде

PBEKeySpec(password, salt, int 100, 512) не означает, что вы будете использовать SHA1 для генерации длины ключа 512. Это просто означает. SHA1 поддерживает максимум 160 бит. Нельзя превышать.

что касается вашего второго вопроса, то взгляните на!--105-->С HMAC-SHA1 ДЛЯ. Есть много утверждений, которые говорят алгоритмы, такие как SHA256 довольно хорошо, если вы долгое хэш.

также, согласно АНБ:

АНБ указывает, что "Криптография открытого ключа эллиптической кривой с использованием 256-разрядная эллиптическая кривая основного модуля, как указано в FIPS-186-2 и SHA-256 подходят для защиты секретной информации на секретный уровень. Использование эллиптической кривой простого модуля 384-бит и SHA-384 необходимы для защиты совершенно секретного информация.

я думаю, что использование функции HMAC в сочетании с SHA512 довольно безопасно.


SHA512 принадлежит к семейству криптографических хэш-функций SHA2. Поскольку SHA1 имеет теоретические недостатки, а SHA512 немного медленнее, чем SHA1 (медленнее лучше при хэшировании паролей), SHA512 (или любой из семейства SHA2) должен быть выбран над SHA1 с целью хэширования паролей.

на самом деле понимание различий в функциях не будет простым, но у вас может быть больше шансов получить ответ на Crypto SE сайт.