使用node.js加密的数字签名
有人能提供一个关于如何使用node.js实现数字签名的基本演练吗?我在谷歌上搜索过,但还没找到。比如说,我有一个API,我想对每个http请求和响应进行签名和验证。这就是我目前的想法,请纠正我的错误: 1) 我需要为客户端生成一个足够随机的密钥,用于对请求进行签名 2) 结果签名(通过标头提供)是使用字符串的密钥散列加密的签名,必须包括:使用node.js加密的数字签名,node.js,encryption,digital-signature,Node.js,Encryption,Digital Signature,有人能提供一个关于如何使用node.js实现数字签名的基本演练吗?我在谷歌上搜索过,但还没找到。比如说,我有一个API,我想对每个http请求和响应进行签名和验证。这就是我目前的想法,请纠正我的错误: 1) 我需要为客户端生成一个足够随机的密钥,用于对请求进行签名 2) 结果签名(通过标头提供)是使用字符串的密钥散列加密的签名,必须包括: 请求主体的散列(防止篡改) 时间戳 暂时的 网址 HTTP动词 然后,服务器将能够检查消息的真实性 问题: 1) 在这个上下文中,nonce(一些随机值)
- 请求主体的散列(防止篡改)李>
- 时间戳李>
- 暂时的李>
- 网址李>
- HTTP动词
使用共享密钥,需要考虑如何以安全的方式存储秘密,例如(如您所建议的)、使用数据库、或用主密钥
加密秘密而不是加密密钥。所有安全解决方案都有风险,即使使用HSM硬件。考虑风险收益。如果您将密钥存储在数据库中,系统管理员或窃取数据库密码的人可以获得所有密钥。在某些情况下,我看到它使用存储在机器中的主加密密钥(事实上,一些HSM只管理此主密钥)下面的代码示例使用
加密库(现在与nodejs内置)为文档生成数字签名
const crypto = require('crypto');
const fs = require('fs');
// See keys/README.md on how to generate this key
const private_key = fs.readFileSync('keys/privateKey.pem', 'utf-8');
// File/Document to be signed
const doc = fs.readFileSync('sample-doc.txt');
// Signing
const signer = crypto.createSign('RSA-SHA256');
signer.write(doc);
signer.end();
// Returns the signature in output_format which can be 'binary', 'hex' or 'base64'
const signature = signer.sign(private_key, 'base64')
console.log('Digital Signature: ', signature);
下面是github的完整代码示例:如果在客户端生成非对称密钥对,则需要一个安全通道将公钥传递给服务器。如果您已经有一个安全通道,那么您的系统是不必要的。你的系统没有真正意义或者没有目的?请查看Node的TLS模块。实现速度要快得多,也比您的设计安全得多。@LukePark的目的是创建一种机制,允许服务器验证请求是否来自系统已知的人(例如,收到授权的api密钥),并允许客户端验证该响应(或webhook)确实是来自那个服务器,但不是来自某个恶意来源,试图伪造它。好吧,这种方法在公共API中非常常见——您可以获得一个apikey、一个apisecret,对您的请求进行签名,服务器可以验证它们,服务器也可以对请求和响应进行签名,您可以验证它们。问题是-如何实现rightHMAC=对称,但非对称密钥是有意义的。e、 g.在客户端创建密钥对,并在注册期间发送公钥。不需要服务器对响应进行签名。正如propose@LukePark一样,仅仅使用TLS就可以确保服务器证书验证,因此身份验证(以及通道隐私)我不确定这篇文章的上下文是什么。HMAC将使用相同的密钥来计算两边的哈希值。它可能想讨论如何使用公钥基础设施在客户机和服务器之间交换密钥。在任何情况下,post都是令人困惑的。所有安全解决方案都有风险,即使使用HSM硬件。考虑风险收益。如果您将密钥存储在数据库中,系统管理员或窃取数据库密码的人可以获得所有密钥。在某些情况下,我看到的是使用您建议的主加密密钥,存储在机器中(事实上,一些HSM只存储此主密钥),是否可以使用加密在pdf中签名并添加普通占位符?