如何在RESTful WCF API中实现HMAC身份验证

本文关键字:实现 HMAC 身份验证 API WCF RESTful | 更新日期: 2023-09-27 18:16:26

我们正在使用WCF构建一个RESTful API(目前是。net 3.5,但很快就会迁移到。net 4)。我们有一个功能框架,但目前还不安全。它需要可以从。net应用程序以及iOS、Android和web应用程序访问。

我们想使用这里和这里描述的HMAC认证方案,但是在描述如何验证哈希时,这两个例子似乎都崩溃了。第一个示例未能描述UserKeys对象(哈希表?),第二个示例在客户端和服务器端缺少GetUserKey方法。

有没有人能解释一下"用户密钥"/令牌是如何在这些示例中生成/存储/检索/使用的,或者提供一个更好的示例(如果可能的话,带源代码)如何在RESTful WCF服务中使用HMAC授权?

编辑:

经过更多的研究,我们确定我们需要更多的"授权"技术,而不是"身份验证"技术(语义?)。我们实现了Basic Authorization,并保护了SSL背后的API。Basic Authorization使用来自web Request的与HMAC Authentication方案相同的"Authorization"头,但是传递的是Base64编码的username:password字符串,而不是令牌。这允许我们根据数据库自定义验证用户,以确定用户是否获得许可并具有访问所需API方法的适当安全权限。

我们当然愿意听取其他关于如何完成自定义用户名/密码验证和其他保护API的方法的选择。

如何在RESTful WCF API中实现HMAC身份验证

检索用户键只是一个实现细节,您可以按自己喜欢的方式执行,但在服务器上,它通常与用户名一起存储在数据库中。

基本方法非常简单。

  1. 服务器和客户端以某种方式交换共享密钥供用户使用。这可以用任何你喜欢的方式来完成,包括发送一个老式的死树风格的信。通常这只是用户输入的密码。
  2. 当客户端想要发送请求时,他构建完整的请求,然后使用密钥计算完整消息体的哈希值(如果需要,还可以选择一些消息头)
  3. 接下来,客户端将计算的哈希值和他的用户名添加到其中一个报头中的消息中,并将其发送给服务。
  4. 服务从消息头中检索用户名,并在自己的数据库中搜索该用户的私有keu。
  5. 接下来,他计算消息体(和选定的标头)的哈希值,使用密钥生成哈希值。
  6. 如果客户端发送的哈希值与服务器计算的哈希值匹配,服务器就知道该消息是由真实客户端发送的,并且没有以任何方式更改。

真正棘手的部分是与用户共享密钥并保证其安全。这就是为什么有些服务允许在有限的生命周期内生成共享密钥,这样你就可以把密钥交给第三方来临时代表你工作。

我们可以在

找到HMAC的实现https://github.com/cuongle/WebAPI.Hmac