Является ли GUID хорошим ключом для (временного) шифрования?

Я генерирую ключ шифрования для шифрования некоторых конфиденциальных данных с помощью алгоритма Rijndael (AES) algoritm. Я использую guid в качестве генератора ключей. Являются ли эти ключи "сильными" достаточно?

Примечание: он чувствителен только в течение 20 минут.

Ответ 1

Нет. Можно указать GUID-ключи, по крайней мере, те, которые генерируются .NET/WinAPI. Также имейте в виду, что GUID даже не имеет истинной 128-битной случайности, поскольку номер версии исправлен. Это дает вам очень слабый ключ.

Хуже того, несколько версий алгоритма GUID страдают от предсказуемости. Дело в том, что GUID не создаются наугад, но они следуют определенным правилам, чтобы сделать практически невозможным совпадение GUID.

Как обсуждалось в комментариях, GUID V1 страдал от проблем с конфиденциальностью (или, наоборот, более слабых клавиш), потому что для их генерации использовался MAC-адрес. С GUID V4 все еще есть способы предсказать последовательность согласно (русскому) источнику ниже.

К счастью,.NET имеет криптографически сильные случайные генераторы на борту. RNGCryptoServiceProvider - ваш друг:

RNGCryptoServiceProvider _cryptoProvider = new RNGCryptoServiceProvider();
int fileLength = 8 * 1024;
var randomBytes = new byte[fileLength];
_cryptoProvider.GetBytes(randomBytes);

Вы можете обратиться к:

Как создать криптографически безопасное псевдослучайное число в С#? - показывает альтернативы, а в комментарии ссылка на Wikipedia приведена:

http://en.wikipedia.org/wiki/Globally_Unique_Identifier

В нем утверждается (согласно википедии, страница на русском языке), что можно предсказать предыдущие и будущие цифры:

http://www.gotdotnet.ru/blogs/denish/1965/

Ответ 2

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

Используйте функции, предоставляемые System.Security.Cryptography namespace. Это то, для чего они предназначены. Читайте на криптографически защищенные генераторы псевдослучайных чисел.

Ответ 3

Я бы не использовал GUID для ключа для шифрования данных. Посмотрите на некоторые из реализаций протокола UUID: UUID они могут быть предсказаны, поскольку они вычисляются как уникальные, а не случайные. Я бы рассмотрел использование пространства имен System.Security.Cryptography для таких объектов, как "TripleDESCryptoServiceProvider" для конфиденциальных данных.