如何签署 API 提供的数据

How to sign data served by API

我通过私人 API 提供数据,我想签署它们。我的用户有点偏执,他们自己保存数据。他们想确保他们保存的数据来自我,并且没有被任何人修改过。我不能只使用 https,因为 Https 只是证明服务器的身份。他们想要确保数据没有改变,这还不够,即使是我也不应该改变它们。

这是我想做的。

  1. 使用 sha1 或其他方式构建数据块的校验和。
  2. 使用私有自签名证书构建此校验和的数字签名。
  3. 通过 https 提供校验和、签名和我的 public 密钥。

我的问题是:

  1. Build a checksum of a data chunck using sha1 or else.

  2. Build a digital signature of this checksum usign a private self-sign certificate.

你应该在消息上做数字签名,而不是校验和(数字签名过程本身涉及消息的散列,但你不必关心这个)

您需要私钥和证书。您可以构建自己的 self-signed 证书或向证书颁发机构 (CA) 申请一个。

  1. serve through https the checksum, its signature, and my public key.

您需要发送签名,而不是校验和。确实不需要 https 来发送签名(但推荐),因为数字签名保护消息的内容并识别签名者

客户端应将您的签名证书的根证书包含在他的信任库中,以便能够验证签名。您可以离线提供或通过 https 提供。

Should I buy a certificate for an authority like Comodo or Symantec ?

客户端必须信任您的根证书,并将其包含在他的信任库中(如上所述)。受信任的 CA 的优点是通常根证书默认存在于客户端 trustore 中,您不需要导入它。但是如果你生成一个self-signed证书并且你提供public部分给客户,他可以手动导入。

Can I sign my checksum using my https certificate ?

否,https 证书必须用于 SSL 连接并且具有特定的密钥用法。根据您的客户端使用的软件,可以拒绝签名

If I buy a certificate from an authority what happened when it expires ? Are my old checksum signature not valid anymore ?

默认情况下,在证书到期日期 之后执行的数字签名验证将失败。如果您的客户想要这样做,那么客户或您必须使用时间戳(由第三方时间戳机构颁发)来保护签名。当时间戳的证书接近过期时,可以添加其他时间戳