Как проверить файл с помощью открытого ключа rsa - PullRequest
1 голос
/ 09 мая 2019

Я основываю свою работу на этом ответе

Я пытаюсь проверить файл с помощью открытого ключа. Вот мой код:

var hash = crypto.createHash("sha256");
hash.setEncoding("hex");
var fd = fs.createReadStream("path/to/my/file");
fd.on("end", function() {
    hash.end();
    var fileHash = hash.read();    
    const publicKey = fs.readFileSync('keys/public_key.pem');
    const verifier = crypto.createVerify('RSA-SHA256');
    const testSignature = verifier.verify(publicKey, fileSignature, 'base64');
    console.log("testSignature: \n" + testSignature);
    if (testSignature === fileHash)
        console.log("ok");
    else
        console.log("not ok");
});
fd.pipe(hash);

Я не знаю, правильный ли этот код, но testSignature равно "ложному", когда я напечатал его в консоли. Зачем ?

testSignature:
false

Зашифрованный хеш (переменная fileSignature) является правильным. Строка base64 такая же, как я ожидал.

Есть идеи о том, что не так в моем коде? Спасибо

EDIT

Вот код, который генерирует подпись:

var hash = crypto.createHash("sha256");
hash.setEncoding("hex");
var fd = fs.createReadStream("path/to/file");
fd.on("end", function() {
    hash.end();
    var fileHash = hash.read();
    var privateKey = fs.readFileSync('keys/private_key.pem');
    var signer = crypto.createSign('RSA-SHA256');
    signer.update(fileHash);
    fileSignature = signer.sign(privateKey, 'base64');
});
fd.pipe(hash);

1 Ответ

2 голосов
/ 09 мая 2019

Предполагая, что path/to/my/file - это файл, содержимое которого вам нужно проверить, вы должны предоставить его verifier.update(). Попробуйте следующее:

const input = fs.readFileSync('path/to/my/file'); // load data contents
const publicKey = fs.readFileSync('keys/public_key.pem').toString(); // load the signature, as a string!
const verifier = crypto.createVerify('RSA-SHA256');
verifier.update(input); // provide data contents to the verifier
const testSignature = verifier.verify(publicKey, fileSignature, 'base64');
console.log("testSignature: \n" + testSignature);

Также убедитесь, что fileSignature является строковым значением, а не Buffer . По какой-то причине, которую я до сих пор пытаюсь понять, почему, если вы передадите объект Buffer в verifier.verify, он не будет работать:

const fileSignatureBuffer = fs.readFileSync('signature.sha256');
const fileSignatureString = fileSignatureBuffer.toString();
// load public key, create the verifier, provide data contents to verifier, etc.
const testSignature = verifier.verify(publicKey, fileSignatureBuffer); // false
const testSignature = verifier.verify(publicKey, fileSignatureString, 'base64'); // true

EDIT: Если вы используете хеш в качестве входных данных для шага подписи, то вы должны передать тот же хеш на шаге проверки. Тогда код будет выглядеть следующим образом:

const publicKey = fs.readFileSync('keys/public_key.pem').toString(); // load the signature, as a string!
const verifier = crypto.createVerify('RSA-SHA256');
verifier.update(fileSignature); // provide the file signature to the verifier
const testSignature = verifier.verify(publicKey, fileSignature, 'base64');
console.log("testSignature: \n" + testSignature);
...