数字签名提供了一种验证通过不安全连接发送的消息的方法。
设置:每个客户端都有自己的私钥和公钥(客户端只需要保存私钥)。服务器将存储每个客户端的公钥。公钥对所有人都是可见的,并且可以被服务器用来识别客户端。只有客户端知道的私钥,它永远不会向任何人显示。
客户端对请求进行签名:连同其余的请求数据,客户端将对组合的请求数据进行哈希处理,并使用私钥对哈希进行加密。服务器将以相同的方式生成哈希(将签名排除在哈希计算之外),然后使用公钥解密签名。如果哈希匹配,则请求是真实的。
请注意,HTTPS 允许客户端证书,因此您可以利用现有工具来完成上述所有操作,而无需编写一行服务器端代码(您只需配置您的 Web 服务器;唯一的技巧是确保仅服务器接受它已经拥有的证书)。此外,客户端代码的数量应该是最少的:除了设置连接以使用客户端证书之外,您不需要做更多的事情。由于您正在控制客户端,因此您可以使用自签名证书并将服务器添加为证书颁发机构。关于在 iPhone 应用程序中使用客户端证书有很多关于 SO 的问题;您可以从阅读它们开始。
Note also that any scheme to protect the web API only works so long as copies of the app are in trusted hands. Should anyone untrustworthy get ahold of it, they can use the app or extract any secret data used by the app and access the API as they will.