2013-10-13 7 views
9

Я работаю над подсистемой аутентификации Java, которая специфицирует хранение паролей в DB как PBKDF2 -генерированные хеши, и теперь я пытаюсь решить, следует ли использовать SHA1 или SHA512 в качестве PFR. Я просмотрел спецификации обоих, но для меня это очень математически интенсивно. Может ли кто-нибудь с лучшим криптопониманием объяснить, как PBKDF2WithHmacSHA512 отличается от PBKDF2WithHmacSHA1?PBKDF2WithHmacSHA512 Vs. 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)... 

ответ

0

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

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

+0

Право, скорость (или отсутствие) имеет решающее значение. Но PBKDF2 включает настраиваемый коэффициент работы. Следовательно, относительная скорость SHA512 против SHA1 не имеет значения. –

34

Давайте разбивку слово по частям:

PBKDF2--WithHmac--SHA512 

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

  • PBKDF2

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

  • HMAC

    Стенды для Keyed-Hash Message Authentication кодекса (HMAC) является конкретная конструкция для вычисления кода аутентификации сообщения (МАС), связанную с криптографической хэш-функции в сочетании с секретным криптографическим ключом. Любая криптографическая хеш-функция может использоваться при вычислении 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 и используется в качестве хэша на основе Message кода аутентификации (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 для генерации keyLength 512. Это просто означает, что. SHA1 поддерживает до 160 бит. Вы не можете этого превышать.

Что касается вашего второго вопроса, посмотрите на HMAC-SHA1. Есть много утверждений, которые говорят, что алгоритмы, такие как SHA256, довольно хороши, если у вас длинный хэш.

Кроме того, в соответствии с АНБ:

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

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

+1

Вы упомянули, что основное различие между «PDBKDF2WithHmacSHA1» и «PDBKDF2WithHmacSHA512» заключается в том, что они производят другую длину хэша (160 бит против 512 бит соответственно). Однако я не думаю, что это правильно, потому что аргумент 'keyLength' в' PBEKeySpec (char [] password, byte [] salt, int iterationCount, int keyLength) 'определяет длину созданного хэша. Если я запустил это определение «512», «256» и «160», я получаю соответствующие хэши разной длины. – DTs

+0

«есть аргументы с обеих сторон, которых достаточно для шифрования». Любые ссылки были бы оценены, я хотел бы прочитать об этом. Я могу найти сравнения между «SHA1» и «SHA512», но не между «PDBKDF2WithHmacSHA1» и «PBKDF2WithHmacSHA512». Кстати, я пробовал делать 'SecretKeyFactory.getInstance (« PBKDF2WithHmacSHA512 »);« изначально, но он выдает «NoSuchAlgorithmException». Не входит в 'javax.crypto'? Я хотел бы использовать его, но я не могу найти Провайдера, предлагающего его, кроме IAIK (они взимают несколько тысяч долларов за их библиотеку JCE, oopss ..). Кто-нибудь знает о других вариантах? – DTs

+0

Вы подразумеваете, что большая длина созданного хэша является индикатором «более безопасного» метода хэширования. Без каких-либо комментариев относительно эффектов длины хэша для определенного типа атаки, такие вещи довольно спекулятивны. Например, если хешированное значение (например, пароль) известно достаточно коротким, скажем, 8 символов, то не имеет никакого значения, насколько велик объем вывода метода хеширования, если его можно вычислить достаточно быстро, атака по-прежнему возможна. –

 Смежные вопросы

  • Нет связанных вопросов^_^