PHP openssl_sign с SHA512

Есть ли шанс заставить метод PHP openssl_sign работать с SHA512 (или любым другим членом семейства SHA2)?

Если я использую RSA в качестве типа ключа (OPENSSL_KEYTYPE_RSA) и подписываюсь через

openssl_sign($data, $signature, $privatekey, 'sha512');

все работает просто отлично.

Однако при использовании OPENSSL_KEYTYPE_DSA подпись остается пустой.

На странице справки OpenSSL я нашел следующее: «Если вы хотите подписать или подтвердить данных с использованием алгоритма DSA, необходимо использовать дайджест dss1».

Итак, я попробовал это с DSA:

openssl_sign($data, $signature, $privatekey, 'dss1');

и это работало нормально.

Я бы предпочел использовать DSA, потому что он создает гораздо более короткие подписи, которые больше подходят для моего варианта использования. Однако меня беспокоит то, что DSS1 — это, по сути, SHA1, который больше не должен использоваться. Это также действительно для комбинации с DSA? Есть ли способ обойти эту проблему и использовать DSA с SHA512?


person CodeX    schedule 05.06.2014    source источник
comment
Просто удар в темноте, но доступен ли SHA160? Он соответствует длине хэша SHA1, поэтому он может быть совместим, но гораздо более безопасен.   -  person otus    schedule 05.06.2014
comment
Насколько мне известно, такой вещи, как SHA160, не существует. И SHA-0, и SHA-1 используют 160-битные ключи.   -  person CodeX    schedule 05.06.2014
comment
Это не стандарт, но некоторые библиотеки предлагают SHA256, усеченный до 160 бит, как SHA224, но короче. Вы можете выполнить усечение самостоятельно, если есть способ передать его в DSA.   -  person otus    schedule 06.06.2014


Ответы (1)


Не совсем ответ, но больше, чем я могу сделать читаемым в комментариях.

Эта примечание к справочной странице OpenSSL устарело (примечание). OpenSSL 0.9.8, использующий API «EVP», который среди прочего делает командная строка dgst, выбрал хэш и PKalg вместе и в результате мог выполнять DSA только с SHA1 (как указано в исходном FIPS без суффикса) и назвал его DSS1 (как ты нашел). Кроме того, он мог генерировать параметры DSA только с подгруппой (q) размером 160, хотя он мог создавать группу (p) размером > 1 КБ, несмотря на то, что FIPS говорит от 512 до 1 КБ с шагом 64 (что было хорошо). еще в 1995 году).

В версиях 1.0.0 и 1.0.1 с новыми и улучшенными API вы можете генерировать все размеры параметров FIPS186-3 (1k/160, 2k/224, 2k/256, 3k/256) и подписывать/проверять DSA любого разумного размера с любым из 4 исходных хэша SHA-2, где хэш длиннее q (подгруппа) усекается в соответствии с FIPS и, таким образом, в основном тратится впустую. (Три варианта «косой черты» SHA-2, добавленные в IIRC FIPS180-4, еще не реализованы в OpenSSL в виде хэшей, а тем более для подписей.)

Как вы, по-видимому, подтвердили, OpenSSL, начиная с 0.9.8, поддерживает RSA (я почти уверен) со всеми хэшами от MD2 до SHA512. Но SHA512 похож на ставку Шнайера высотой в милю; для того, чтобы RSA сохранил свою номинальную силу, вам нужно более 15 кбит в соответствии с NIST и ECRYPT (см. www.keylength.com), и это будет очень медленно.

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

Если, когда и как это (или они) доступны в PHP, я ничего не знаю.

И, как всегда с криптографией, если вы взаимодействуете с одной или несколькими другими системами, также проверьте их возможности.

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

person dave_thompson_085    schedule 06.06.2014
comment
Спасибо, что поделились некоторой справочной информацией по этой теме. Я дал вам голос, но, как вы уже упомянули, это не совсем ответ на мой вопрос. :) - person CodeX; 06.06.2014