这是我的场景...
用户客户端应用程序向 Web 服务发出访问请求。
Web 服务以仅在 X 秒/分钟内有效的“密钥”响应(时间可以是可变的,或者至少可以在我的 Web 服务中定义)
用户客户端应用程序立即使用该密钥发出进一步的请求。
Web 服务检查密钥是否仍然有效,如果它继续请求,则相应地响应。
我需要在不实际将密钥存储在数据库中的情况下执行此操作,所以我猜测用于生成密钥(使用盐)的哈希应该以某种方式基于时间。
我想我真正要问的是最好的方法是什么。
语言:VB.Net
这是我的场景...
用户客户端应用程序向 Web 服务发出访问请求。
Web 服务以仅在 X 秒/分钟内有效的“密钥”响应(时间可以是可变的,或者至少可以在我的 Web 服务中定义)
用户客户端应用程序立即使用该密钥发出进一步的请求。
Web 服务检查密钥是否仍然有效,如果它继续请求,则相应地响应。
我需要在不实际将密钥存储在数据库中的情况下执行此操作,所以我猜测用于生成密钥(使用盐)的哈希应该以某种方式基于时间。
我想我真正要问的是最好的方法是什么。
语言:VB.Net
您无法将密钥存储在某处,哈希的本质是您无法获取生成它的信息。如果您想取回信息,请改用加密算法。
我们为此使用了第 3 方工具。它被称为 Crypkey。非常可配置但不便宜。
最后我们去了以下......
应用程序已知的盐 用户名 当前日期/时间 + 5 秒
将以上内容按特定顺序组合为字符串,然后 MD5 对其进行哈希处理。
我们有一个特殊的 URL,他们可以使用哈希作为查询字符串参数。
我们将哈希值与请求时生成的 5 个哈希值进行比较(一个用于当前秒,一个用于前 4 秒中的每一秒)。如果 QS 参数上的哈希与生成的这 5 个哈希之一匹配,则我们接受请求并执行相关操作。
我们的 API 上有一个方法,它返回一个已应用哈希的 URL。然后 API 客户端可以将他们的请求发送到立即提供的 URL。在检索 URL 后超过 5 秒发出的任何请求都将被拒绝。
所以我们有一个密钥,它从生成之日起仅在 5 秒内有效。
这使我们能够为用户提供从 API 客户端“自动登录”其站点的能力。客户端请求登录 URL(带有散列),然后立即将用户的 Web 浏览器定向到该 URL。URL 处理请求,检查哈希,如果有效,设置登录 cookie 并将它们重定向到他们的管理页面。
简单、有效,并且由于我们所有的 API 请求都通过 SSL,因此是安全的。