2017-01-06 9 views
2

Я генерирую произвольно значение IV каждый раз, когда я шифрую при выполнении AES/CBC.Есть ли какое-либо безопасное улучшение, если значение хэш-функции IV?

private static IvParameterSpec getRandomIvParameterSpec() { 
    byte[] iv = new byte[16]; 
    new SecureRandom().nextBytes(iv); 
    return new IvParameterSpec(iv); 
} 

И я соглашаюсь IV Значение для шифрования байта каждый раз, когда я шифрую.

Есть ли безопасное улучшение, если I hash (SHA-256) значение IV перед concat для шифрования байта?

+4

** Не пытайтесь свернуть свои собственные улучшения в области безопасности. ** Это не очень хорошо подходит для безопасности вашего приложения. – Makoto

ответ

3

SHA-256 is инъекционный. Вы даете ему тот же вход, он даст вам тот же результат. Это не сюръективный, однако. Если м и м как хэш ч, вы не можете сделать вывод, что м = м , даже если вы знаете, что | m | = | m | (оба сообщения имеют одинаковую длину).

Поэтому применение SHA-256 (или любой детерминированной функции) не может увеличить энтропию ваших данных. В лучшем случае это не уменьшит его. Другими словами: если ваши данные - 16 чисто случайных байтов, это не будет «больше, чем чисто случайным» после того, как вы его сделаете. И если ваши данные не были чисто случайными для начала, то хэширование не поможет сделать его случайным. Прежде всего, вам нужно использовать лучший источник энтропии.

Еще одна проблема, о которой вы не говорили, заключается в том, что у вас в настоящее время есть 16 случайных байтов, но если вы поместите их в свою хэш-функцию SHA-256, вы получите 32 байта. Какие из них вы собираетесь использовать? Если вы используете только каждый второй байт - из-за инъективности - вы не получите все возможные битовые шаблоны, даже если ваш вход был совершенно случайным, а функция хэша была безупречной. (Если бы вы это сделали, то это означало бы принцип pidgin hole - означает, что другая половина байтов всегда будет функцией байтов, которые вы выбрали. Только очень дрянная хэш-функция, которую SHA-256, конечно, не , будет иметь такое свойство.) Если вы попытаетесь быть умными и объединить байты каким-то «умным» способом, скорее всего, вы сделаете еще хуже.

Таким образом, короткий ответ: просто не делайте этого. Создайте столько случайных байтов, сколько вам нужно, используя самый сильный источник недетерминированной энтропии, который у вас есть, и используйте их напрямую.

+0

отличный ответ мне! большое спасибо! – hanjoonk

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

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