2013-03-14 6 views
3

Я пытаюсь сделать эквивалент для следующей функции PHPКак подписать ж/секретный ключ в Node.js

openssl_private_encrypt 

использовать свой закрытый ключ для входа в строке

Вот что Я делаю

var signer = crypto.createSign('RSA-SHA256').update(timestamp + '|' + userId); 
var signature = signer.sign(privKey, 'base64'); 

Мой первый вопрос - что это значит, когда RSA и SHA256 собраны вместе? Я понимаю, что это значит зашифровать что-либо с помощью закрытого ключа RSA или хешировать что-то с помощью SHA256. Но я не могу понять, что значит иметь этих двух вместе.

Я положил его туда, потому что для createSign требуется строковый параметр («RSA» не поддерживается), и RSA-SHA256 - это самая близкая вещь, которую я нашел.

Мой второй вопрос заключается в том, как я

openssl_private_encrypt 

в Node.js?

ответ

2

Обычные операции подписи состоят из вычисления хеша, который затем (если требуется для функции), а затем зашифровывается закрытым ключом. Хэш представляет собой сжатое - меньшее - представление сообщения, для которого не может быть найдено дублирующих хэшей (коллизий). Для RSA сообщение затем дополняется с использованием схемы, найденной в PKCS # 1 v2.1 (общедоступный стандарт), после чего выполняется модульное возведение в степень.

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

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

Чтобы создать эквивалент для openssl_private_encrypt, вы должны иметь возможность выполнять метод заполнения PKCS # 1 v1.5 и модульное возведение в степень. Вероятно, вы можете получить эти функции из исходного кода Node.js, маловероятно, что вы найдете их в API более высокого уровня. Однако вам рекомендуется отказаться от функции openssl_private_encrypt в PHP и использовать функцию подписи более высокого уровня.

+0

Привет, большое спасибо за объяснение. Теперь все ясно. Но я фактически работаю над проектом совместной работы с компаниями. И их документы только дали пример «openssl_private_encrypt» в PHP. У меня нет выбора, кроме как идти по этому маршруту. – Max

+0

Вы знаете, что «openssl_private_encrypt» делает хэш-расчет до подписания, и если да, то какой хэш-алгоритм? Большое спасибо! – Max

+0

Нет, нет, он просто выполняет PKCS # 1 padding. См. здесь, http://www.sitepoint.com/forums/showthread.php?610882-OpenSSL-Private-Key-Encryption. Обратите внимание, что PKCS # 1 использует 11 байтов служебных накладных расходов для схемы подписи 1,5 (без хэш-структуры *, то есть). Таким образом, пользователь, вероятно, использовал 128-байтный (1024-разрядный) размер ключа. –

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