2016-08-21 3 views
3

Я генерирую частные и открытые ключи, используя OpenSSL в PHP, который я намерен хранить в базе данных (хотя вам, вероятно, не нужно знать PHP, чтобы ответить на этот вопрос).Какова максимальная длина открытых и открытых ключей RSA?

Они выглядят так:

-----BEGIN ENCRYPTED PRIVATE KEY----- 
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIi4rlLSKA9/8CAggA 
... 
-----END ENCRYPTED PRIVATE KEY----- 

и

-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8YvAFZHSGNITeDNdXFbc 
... 
-----END PUBLIC KEY----- 

(да и это только примеры)

Они были созданы таким образом:

$resource = openssl_pkey_new([ 
     'private_key_bits' => '2048', 
     "private_key_type" => OPENSSL_KEYTYPE_RSA, 
]); 
openssl_pkey_export($resource, $privateKey, $passPhrase) === false 
$opensslDetails = openssl_pkey_get_details($resource); 
$publicKey = $opensslDetails['key']; 

Я хочу знать, что максимальная длина для этих частных и открытых ключей.

Из моих экспериментов, я обнаружил, что:

  • 1704 символов для частных ключей
  • 1834 символов для закрытых ключей с идентификационной фразой
  • 451 символов для открытых ключей

Однако я не нашли никакой официальной документации по этому поводу, чтобы доказать, что это так, поэтому я не могу быть уверен.

+0

2 раза размер ключа для открытого ключа и 8-кратный размер ключа для закрытого ключа являются хорошими верхними границами. Если вам действительно нужно, то это более точно, тогда вам нужно изучить, какие элементы находятся в ключе и как они сериализованы.Его можно точно рассчитать, но действительный ключ имеет много форм, и не все элементы закрытого ключа являются обязательными. Этот вопрос, вероятно, слишком широк, потому что существует много действительных ключей, которые имеют разные размеры. –

+0

Верхняя граница более чем достаточна. Мне просто нужен верхний для базы данных. –

+0

@ArtjomB. Также, на что вы основываете эти цифры. Мой размер ключа - 2048 бит, и мой верхний 2048 для частных и 1024 для публики? –

ответ

2

Какова максимальная длина открытых и открытых ключей RSA?

В теории нет ограничений. На практике существует предел. Кроме того, на размер модуля обычно налагаются ограничения (n = p * q), а не открытый или закрытый ключ per se. Вы можете столкнуться с дополнительными ограничениями со своего веб-сервера или базы данных.

Для ключей OpenSSL и RSA ключи RSA ограничены до 16K в поколении. Также существует ограничение на использование утилиты OpenSSL s_client, используемой во время обмена ключами. Предел во время обмена ключами составляет 2 К, и он кажется искусственно низким для меня. Вы можете направить ограничение s_client, избегая ключевых транспортных схем, используемых во время соглашения о ключах (т. Е. Используйте DH или EDH вместо RSA).

Если вы нажмете пределы, тогда обычно указывается время перехода на эллиптические кривые. 16K RSA и 521-бит EC обеспечивают около 512 бит безопасности.

Также см. Openssl software failure for RSA 16K modulus в списке рассылки пользователей OpenSSL.


Вот некоторые Factoids на RSA время генерирования ключа с использованием Crypto++ library из небольшого (256-бит) до большой (60K-бит). Я считаю, что цифры были собраны около 5 лет назад на машине Core2 Duo. OpenSSL должен иметь асимптотически одинаковое время работы.

cryptopp$ rsa_kgen.exe 61440 
Elapsed time for 61140 RSA key: 25654.01s (7 hours, 7 minutes, 34 seconds) 
cryptopp$ rsa_kgen.exe 30720 
Elapsed time for 30720 RSA key: 2255.30s (37 minutes, 35 seconds) 
cryptopp$ rsa_kgen.exe 15360 
Elapsed time for 15360 RSA key: 285.05s (4 minutes, 45 seconds) 
cryptopp$ rsa_kgen.exe 11776 
Elapsed time for 11776 RSA key: 142.52s (2 minutes, 22 seconds) 
cryptopp$ rsa_kgen.exe 8192 
Elapsed time for 8192 RSA key: 43.08s (43 seconds) 
cryptopp$ rsa_kgen.exe 4096 
Elapsed time for 4096 RSA key: 0.70s 
cryptopp$ rsa_kgen.exe 2048 
Elapsed time for 2048 RSA key: 0.09s 
cryptopp$ rsa_kgen.exe 1024 
Elapsed time for 1024 RSA key: 0.01s 
cryptopp$ rsa_kgen.exe 512 
Elapsed time for 512 RSA key: 0.00s 
cryptopp$ rsa_kgen.exe 256 
Elapsed time for 256 RSA key: 0.00s 
+0

Ничего себе, это подробный ответ. Итак, что, на ваш взгляд, является хорошим верхним рядом с моей базой данных, поскольку мне, очевидно, нужен верхний. –

+0

@YahyaUddin - Вы используете ключ, который имеет уровень безопасности для удовлетворения ваших потребностей. Если база данных не может хранить ее, потому что она слишком велика, то вы увеличиваете размер поля или переключаете базы данных, чтобы обеспечить соблюдение ваших требований безопасности. Также см. [Существуют ли ограничения длины строки в mysql?] (Http://stackoverflow.com/q/3022170), [Длина строки строки в Postgres SQL?] (Http://stackoverflow.com/q/23988406) и [Как SQLite на Android обрабатывает длинные строки?] (http://stackoverflow.com/q/3068180) Возможно, вам следует указать имя механизма базы данных и вашей схемы. – jww

+0

Я использую MySql. Я хотел бы определить верхнюю границу длины строки. –

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