Генерация подписей RSA-SHA1 с помощью JavaScript - PullRequest
5 голосов
/ 25 января 2012

Я хотел бы создать подписи RSA-SHA1 с помощью библиотеки JavaScript RSA-Sign .В частности, я хотел бы использовать это для подписи запросов OAuth.

Однако подпись, сгенерированная библиотекой JavaScript, выглядит иначе, чем подпись, которую я могу сгенерировать, например, с

$ echo -n "x" | openssl dgst -sha1 -sign priv.key -binary | openssl base64 | xargs echo -n
eV0ZrD7ZrTsuzHHYSwLfUJhXuM96D6ZyIzD5FFphzHbKRaO4TMeTR7bJjkuPib+l
EccM7t6YNDvRgOHyXJDVZZQTg5G4D4jnGVmOgeuti1etCCpLsb1Rl3sfJF/rIlgA
AmejvBbrEG+n8L+GeD6Vd3cneW7k2Rksnh+/BWnnR3c=

В отличие от этого: Это то, что генерирует библиотека (в кодировке base64):

Nzk1ZDE5YWMzZWQ5YWQzYjJlY2M3MWQ4NGIwMmRmNTA5ODU3YjhjZjdhMGZhNjcy
MjMzMGY5MTQ1YTYxY2M3Ng0KY2E0NWEzYjg0Y2M3OTM0N2I2Yzk4ZTRiOGY4OWJm
YTUxMWM3MGNlZWRlOTgzNDNiZDE4MGUxZjI1YzkwZDU2NQ0KOTQxMzgzOTFiODBm
ODhlNzE5NTk4ZTgxZWJhZDhiNTdhZDA4MmE0YmIxYmQ1MTk3N2IxZjI0NWZlYjIy
NTgwMA0KMDI2N2EzYmMxNmViMTA2ZmE3ZjBiZjg2NzgzZTk1Nzc3NzI3Nzk2ZWU0
ZDkxOTJjOWUxZmJmMDU2OWU3NDc3Nw==

(конечно, при условии того же ввода и ключа)

Возможно ли, что это из-за реализации SHA1используемый?В этом случае я мог бы попытаться использовать другой.

Я не эксперт по криптографии, но OAuth RFC 5849 говорит , что RSASSA-PKCS1-V1_5-SIGN должен бытьиспользуется, что, кажется, имеет место для библиотеки.

Большое спасибо.

1 Ответ

4 голосов
/ 27 января 2012

Я попробовал как команду openssl, так и библиотеку JS, о которой вы упоминали выше, и результаты соответствуют.Сигнатуры, которые я получаю обоими способами, одинаковы.

Одна вещь, которую я заметил из вашего поста, заключается в том, что кодированный в base64 результат, полученный из библиотеки, слишком длинный и выглядит неправильно.Возможно ли, что вы не кодируете base64 двоичной подписи?

Не могли бы вы попробовать этот код для получения строки подписи в кодировке base64?

function doSign() {
  var rsa = new RSAKey();
  rsa.readPrivateKeyFromPEMString(document.form1.prvkey1.value); //replace with your private key
  var hSig = rsa.signString("x", "sha1");
  var base64_encoded_signature = hex2b64(hSig);
}

Если вы сравниваете значение"base64_encoded_signature" с тем, что вы получаете из команды openssl, они должны быть одинаковыми.

...