Node.js verify.verify () странное поведение - PullRequest
0 голосов
/ 28 сентября 2018

Я работал над приложением для цифровой подписи node.js, затем столкнулся со странным поведением, которое я не смог понять.

сначала я сгенерировал пару открытый / закрытый ключ как , описанную здесь

затем я реализовал следующий скрипт

  const crypto = require('crypto');
  const fs = require('fs');
  const privateKey = fs.readFileSync('./private_key.pem');
  const publicKey = fs.readFileSync('./public_key.pem');
  const hashAlg = 'sha256'
  const data = Buffer.from('test signature'.repeat(100), 'utf8');

  let bytes = []
  // sign
  const sign = crypto.createSign(hashAlg);
  sign.update(data);
  const signature = sign.sign(privateKey);
  fs.writeFileSync(`./signature.${hashAlg}`, publicKey);
  const verifier = crypto.createVerify(hashAlg);
  verifier.update(data);
  const result = verifier.verify(publicKey, signature);
  for(let i=0; i < publicKey.length ; i++){
    try{
      const verifier2 = crypto.createVerify('RSA-SHA256');
      verifier2.update(data);
      const invalidPublicKey = Buffer.from(publicKey);
      invalidPublicKey[i] = invalidPublicKey[i]+1;
      const result2 = verifier2.verify(invalidPublicKey, signature);
      if(result2) {
        bytes.push(i);
      };
    } catch (e) {
      // error to be handled
    }
  }
  if(bytes.length){
    console.log('****************');
    console.log(`key length: ${publicKey.length}`); // 451
    console.log('Bytes to be changed, and the verify would be valid');
    console.log(bytes.join(',')); // 49, 450
    console.log('****************');
  }

Как другой открытый ключ проверяет подпись, я что-то здесь упускаю?

1 Ответ

0 голосов
/ 29 сентября 2018

Итак, если вы, очевидно, использовали OpenSSL rsa -pubout из пары ключей RSA-2048, если это было в Unix:

  • символ со смещением 49 в файле PEM кодирует частибайты со смещением 16 и 17 (в частности, младшие 4 бита смещения 16 и верхние 2 бита смещения 17).Это 2-байтовые значения NULL, представляющие часть параметров AlgorithmIdentifier в формате X.509 SubjectPublicKeyInfo.Для RSA нет параметров алгоритма (именно поэтому кодирование использует NULL), и хотя это поле все еще должно быть декодировано, возможно, nodejs не потрудится сделать это, зная, что это не нужно и будет проигнорировано.

  • символ со смещением 450 в файле PEM является новой строкой, заканчивающей строку нижнего колонтитула.Хотя это и требуется определением формата, на самом деле нет необходимости анализировать его для извлечения содержимого файла, а именно для двоичного объекта с открытым ключом, и, возможно, nodejs этого не делает.

...