数字签名与node.jsencryption

有人可以提供一个关于如何使用node.js实现数字签名的基本演练吗? 我GOOGLE了,但没有得到它呢。 说,我有一个API,我想签署和validation每个HTTP请求和它的响应。 这就是我目前的想象,请纠正我错在哪里:

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

2)生成的签名(通过头文件提供)是使用该string的密钥哈希encryption的,该哈希必须包括:

  • 请求主体散列(防止篡改);
  • 时间戳;
  • 随机数;
  • url;
  • HTTP动词

然后,服务器将能够检查消息的真实性。

问题:

1)在nonce(一些随机值)和一个时间戳(我读过一个同时使用两者的post被build议)之间的上下文有什么区别?

2)我是否需要将eTag标头包含在该string中?

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

4)我是否应该在API服务器上保留与客户端相同的密钥,并使用它解密并检查请求,或者应该存储在API服务器上的密钥和服务器上存储的与API通信的密钥私钥 – 公钥对? 如果他们确实需要成为一个私钥 – 公钥密钥对,那么我如何使用公钥encryption私钥(反之亦然)?

Plz,纠正我描述中的错误,并补充,我错过了什么。 谢谢。

亚马逊RESTauthentication就是很好的例子来回答你的问题。 AWS需要使用一组规则:规范化,编码或时间戳,对请求数据应用HMAC散列来“签名请求”。 签名包含在HTTP请求的授权标头中

HMAC是一种对称algorithm,客户端和服务器共享密钥,即用于双方计算哈希。 如果它们匹配,则该请求已经被发送给授权方

在这种情况下,对称密钥也是有意义的。 例如在客户端创build密钥对并在注册期间发送公钥。 服务器不需要签名回应。 只使用TLS通道,客户端可以信任服务器validation服务器证书(TLS还通过encryption提供通道私有性)

使用共享密钥时,需要考虑如何以安全的方式存储秘密信息,例如(如你所build议的),使用数据库,或使用主密钥encryption秘密而不是普通密钥

所有安全解决scheme都有风险,即使使用HSM硬件。 考虑风险收益。 如果将密钥存储在数据库中,则系统pipe理员或窃取数据库密码的人员可以获取所有这些密钥。 在某些情况下,我已经看到使用存储在机器中的主encryption密钥(实际上有些HSM只是pipe理这个主密钥)