javascript - 如何使用 rsa 公钥验证文件

标签 javascript node.js rsa node-crypto

我的工作基于 this answer

我正在尝试使用公钥验证文件。这是我的代码:

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 等于“false”。为什么 ?

testSignature:
false

加密哈希(fileSignature 变量)是正确的。 base64 字符串与我预期的相同。

知道我的代码有什么问题吗?谢谢

编辑

这是生成签名的代码:

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);

最佳答案

假设 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

编辑: 如果您使用散列作为签名步骤的输入,那么您必须在验证步骤中传递相同的散列。然后代码将如下所示:

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);

关于javascript - 如何使用 rsa 公钥验证文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56062691/

相关文章:

javascript - 从 Node 中的 CronJob 调用 API 没有响应

javascript - 我应该使用 process.nextTick 还是 setImmediate 进行异步迭代?

xml - 使用 M2Crypto 从 xml 数据文件生成公钥进行签名验证

javascript - 检查了所有单选按钮,然后获取各自行的 "first td"值,然后在单击提交后立即将所有第一个 td 的值放入 url 中

javascript - 在 Javascript 中,属性如何修改对象

encryption - OAEPwithMD5andMGF1Padding in node-rsa

encryption - RSA算法 key 生成

javascript - 你能在 Mongoose 中搜索其他带有实例方法的模型吗?

javascript - 您选择的跨浏览器 javascript GUI

javascript - Cypress 自定义查找命令不可链接