Каковы различные способы создания ключа для записи

Я использую aes256 с php для шифрования данных.
В разных документах я вижу разные способы генерации ключа, например:

$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

Или же

$Key = "what ever, plain string";

Или же

$Key = "123456789abcdef";//128bit

В чем смысл первого примера, в отличие от других?
Почему бы просто не использовать случайную строку длиной 128 или 256?

Я использую пример здесь http://php.net/manual/en/function.mcrypt-encrypt.php с каждым из различных методов генерации ключей выше.

0

Решение

У вас есть три разных длины ключа. AES указывается для следующих трех длин ключа: 128-бит (16 байт), 192-бит (24 байт) и 256-бит (32 байт). Я не буду вдаваться в подробности о силе ключей разных размеров.

Давайте разберем их:

$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

Это шестнадцатеричное кодирование, длина которого составляет 64 символа. Длина самого ключа составляет 32 байта, что означает, что когда ключ передается mcrypt_encrypt() AES-256 используется автоматически.


$Key = "what ever, plain string";

Это строка из 23 символов, которую можно использовать в качестве ключа для версий PHP до 5.6.0. Это недопустимая длина для ключа в AES. MCrypt дополнит ключ \0 до следующего допустимого размера ключа, который составляет 24 байта для AES-192. Так что этот ключ на самом деле является действительным ключом для PHP 5.6 в этой форме:

$Key = "what ever, plain string\0";

$Key = "123456789abcdef"; //128bit

Это 15-значный ключ. Как и в предыдущем примере, он будет дополнен до 16 байтов, так что используется AES-128.

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

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

Существует только несколько сценариев, в которых жесткое кодирование симметричного ключа в коде может быть использовано:

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]