SHA-256 is инъекционный. Вы даете ему тот же вход, он даст вам тот же результат. Это не сюръективный, однако. Если м и м как хэш ч, вы не можете сделать вывод, что м = м , даже если вы знаете, что | m | = | m | (оба сообщения имеют одинаковую длину).
Поэтому применение SHA-256 (или любой детерминированной функции) не может увеличить энтропию ваших данных. В лучшем случае это не уменьшит его. Другими словами: если ваши данные - 16 чисто случайных байтов, это не будет «больше, чем чисто случайным» после того, как вы его сделаете. И если ваши данные не были чисто случайными для начала, то хэширование не поможет сделать его случайным. Прежде всего, вам нужно использовать лучший источник энтропии.
Еще одна проблема, о которой вы не говорили, заключается в том, что у вас в настоящее время есть 16 случайных байтов, но если вы поместите их в свою хэш-функцию SHA-256, вы получите 32 байта. Какие из них вы собираетесь использовать? Если вы используете только каждый второй байт - из-за инъективности - вы не получите все возможные битовые шаблоны, даже если ваш вход был совершенно случайным, а функция хэша была безупречной. (Если бы вы это сделали, то это означало бы принцип pidgin hole - означает, что другая половина байтов всегда будет функцией байтов, которые вы выбрали. Только очень дрянная хэш-функция, которую SHA-256, конечно, не , будет иметь такое свойство.) Если вы попытаетесь быть умными и объединить байты каким-то «умным» способом, скорее всего, вы сделаете еще хуже.
Таким образом, короткий ответ: просто не делайте этого. Создайте столько случайных байтов, сколько вам нужно, используя самый сильный источник недетерминированной энтропии, который у вас есть, и используйте их напрямую.
** Не пытайтесь свернуть свои собственные улучшения в области безопасности. ** Это не очень хорошо подходит для безопасности вашего приложения. – Makoto