我想使用消息身份验证代码 (MAC) 对对我的 REST API 的调用进行签名,哪种算法在 Java、php、Ruby 和 C# 中使用起来既方便又舒适?
更长的故事:我的应用程序(Play Framework 2.0)提供了一个非常简单的 REST API,只有几个服务可以由有限且已知的*组客户端访问。安全性在这里很重要,对客户来说也很容易使用。
(* 已知意味着他们必须先在应用程序中注册,这是他们获得 MAC 秘密的地方,我不知道他们是谁以及他们使用什么技术。)
我想实现以下方法:
- 使用 SSL
- 使用 MAC 对 REST 消息进行签名
我实现了一个测试用例,我使用我的密码加密器(类似于此处的示例代码)和 PBKDF2WithHmacSHA1 进行签名。我花了一些时间让签名工作,特别是因为我想将签名作为 URL 参数发送,并且必须对其进行两次编码才能以正确的格式获取它。
生成的签名是一个字节[],我使用 org.apache.commons.codec.binary.StringUtils 将其转换为 UTF-8 编码的字符串,然后使用 java.net.URLEncoder 再次对其进行编码以获得正确的 URL 参数。该解决方案有效,但感觉有点愚蠢且过于复杂。
这段经历让我想到了这个问题,我想让我的客户轻松舒适地使用该服务,而且非常安全。那么,我为我的签名选择什么加密算法?对于 Java、php、Ruby、C# 等最常见的 Web 平台来说很容易实现,并且至少可以在不太常见的语言中使用。