使用node.js加密的数字签名

使用node.js加密的数字签名,node.js,encryption,digital-signature,Node.js,Encryption,Digital Signature,有人能提供一个关于如何使用node.js实现数字签名的基本演练吗?我在谷歌上搜索过,但还没找到。比如说,我有一个API,我想对每个http请求和响应进行签名和验证。这就是我目前的想法,请纠正我的错误: 1) 我需要为客户端生成一个足够随机的密钥,用于对请求进行签名 2) 结果签名(通过标头提供)是使用字符串的密钥散列加密的签名,必须包括: 请求主体的散列(防止篡改) 时间戳 暂时的 网址 HTTP动词 然后,服务器将能够检查消息的真实性 问题: 1) 在这个上下文中,nonce(一些随机值)

有人能提供一个关于如何使用node.js实现数字签名的基本演练吗?我在谷歌上搜索过,但还没找到。比如说,我有一个API,我想对每个http请求和响应进行签名和验证。这就是我目前的想法,请纠正我的错误:

1) 我需要为客户端生成一个足够随机的密钥,用于对请求进行签名

2) 结果签名(通过标头提供)是使用字符串的密钥散列加密的签名,必须包括:

  • 请求主体的散列(防止篡改)
  • 时间戳
  • 暂时的
  • 网址
  • HTTP动词
然后,服务器将能够检查消息的真实性

问题:

1) 在这个上下文中,nonce(一些随机值)和timestamp(我读过一篇文章,其中建议同时使用两者)之间有什么区别

2) 我需要在该字符串中包含eTag头吗

3) 上面未列出的其他内容还应包括哪些

4) 我应该在API服务器上保留与客户端相同的密钥,并用它解密和检查请求,还是应该将存储在API服务器上的密钥和存储在服务器上的密钥(该服务器与API通信以获得私有公钥对)?如果它们确实需要是私钥-公钥-密钥对,我如何在节点中使用公钥(反之亦然)解密用私钥加密的内容

请纠正我描述中的错误,并添加我遗漏的内容。谢谢。

是回答您问题的好例子。AWS要求使用一组规则对请求数据应用HMAC哈希来“对请求签名”:规范化、编码或时间戳。签名包含在HTTP请求的授权标头中

HMAC是一种对称算法,客户端和服务器共享密钥,用于双方计算散列。如果它们匹配,则已向授权方发送请求

在这种情况下,非等距键也有意义。e、 g.在客户端创建密钥对,并在注册期间发送公钥。不需要服务器对响应进行签名。仅使用TLS通道,客户端就可以信任服务器验证服务器证书(TLS还通过加密提供通道隐私)

使用共享密钥,需要考虑如何以安全的方式存储秘密,例如(如您所建议的)、使用数据库、或用主密钥

加密秘密而不是加密密钥。
所有安全解决方案都有风险,即使使用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中签名并添加普通占位符?