我们想使用如here和here所述的HMAC认证方案,但是在描述如何验证散列时,这两个例子似乎都分崩离析.第一个示例无法描述UserKeys对象(散列表?),第二个示例在客户端和服务器端缺少GetUserKey方法.
任何人都可以提供关于如何在这些示例中生成/存储/检索/使用“用户密钥”/令牌的说明,或者提供一个更好的示例(如果可能,使用源代码)如何在RESTful WCF服务中使用HMAC授权?
编辑:
经过更多的研究,我们确定我们需要更多的“Authorization”技术,而不是“Authentication”技术(语义?).我们实施了基本授权,并在SSL后保证了SSL.基本授权使用Web请求中相同的“授权”标头作为HMAC认证方案,但传递一个用户名:密码字符串,编码在Base64而不是令牌.这允许我们根据我们的数据库定制验证用户,以确定用户是否获得许可,并具有访问所需API方法的适当安全权限.
解决方法
基本的方法真的很简单.
>不知何故,服务器和客户端交换共享密钥供用户使用.这可以做任何你喜欢的方式,包括发送一个老式的死树风格的信.通常这只是用户输入的密码.
>当客户端要发送请求时,他构建完整的请求,然后使用秘密密钥计算整个消息正文中的散列(如果需要,还可以选择一些消息头)
>接下来,客户端将计算的散列和他的用户名添加到其中一个标题中的消息,并将其发送到服务.
>该服务从消息头中检索用户名,并在其自己的数据库中搜索该用户的私有密钥.
>接下来,他使用密钥计算消息体上的散列(和选定的标题)来生成其散列.
>如果客户端发送的哈希与服务器计算服务器的哈希匹配,则服务器知道该消息是由真实客户端发送的,并且没有以任何方式进行更改.
真正唯一棘手的部分是与用户共享一个密钥,并保持安全.这就是为什么一些服务允许在有限的使用寿命期间生成共享密钥,所以您可以给第三方提供密钥来临时工作.