首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用rsa公钥验证文件

如何使用rsa公钥验证文件
EN

Stack Overflow用户
提问于 2019-05-09 15:20:27
回答 1查看 1.7K关注 0票数 1

我的工作是基于这个答案

我试着用公钥来验证一个文件。这是我的代码:

代码语言:javascript
复制
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“。为什么?

代码语言:javascript
复制
testSignature:
false

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

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

编辑

下面是生成签名的代码:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-09 19:04:48

假设path/to/my/file是您需要验证的内容的文件,则必须将其内容提供给verifier.update()。尝试以下几点:

代码语言:javascript
复制
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是字符串值,而不是缓冲区。由于某些原因,我仍然试图弄清楚为什么,如果您将一个缓冲区对象传递给verifier.verify,它将无法工作:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56062691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档