如何从头开始实现HMAC-SHA认证



我想使用与AWS签名过程类似的技术实现web应用程序api的身份验证。服务器将为用户web浏览器客户端呈现html。该应用程序还将返回json非浏览器客户端(iphone, android,黑莓,ipad等),我正试图编写身份验证代码,允许单个用户从多个客户端登录(记住)到应用程序。从任何一个客户端注销不应该撤销所有其他客户端的令牌/cookie。

  1. 当用户注册或登录时,客户端(特别是本机移动客户端或web浏览器)如何获得私钥/密钥?我的理解是密钥不应该通过网络发送。它可以通过ssl发送吗?

  2. 对于浏览器客户端,私钥是存储在cookie中还是存储在其他形式的本地存储中?例如,对于通用api令牌认证,令牌是否存储在浏览器的cookie中,而存储在手机的db中

  3. 当客户端是浏览器时,如何用私钥签名请求?即生成id +私钥+请求的散列。对于本地移动客户端或服务器到服务器的通信,我相信有一些库可以用来生成签名请求。当请求来自浏览器时,它是如何工作的?

  4. 如果需要在多个客户端(平板电脑,iphone,工作电脑,家用笔记本电脑等)上记住用户,用户是否需要为每个客户端提供一组私钥/令牌?

我会使用Rails的设计,但它需要你编写自己的令牌认证代码。

我也在研究OAuth,问题2和4都适用于它,但我真的想研究AWS方法。

你从一个解决方案(HMAC)开始,但我不认为你的"问题"适合你的解决方案:)。

我会尽我所能回答这个问题。

  1. 在我看来,私钥是由共享的公钥衍生而来的。或者您可以共享私钥,但前提是已经建立了身份验证(换句话说:您已经确定您在与谁交谈)并且连接是安全的(加密的)。你仍然会很容易受到中路人的攻击。我不确定。cookie是不安全的。偷饼干,偷私钥。我的首选是本地存储的密钥(文件或存储),由密码加密。
  2. 你必须设计某种客户端库(javascript或类似的东西)。
  3. 是的。

既然可以像oAuth那样共享令牌,为什么要共享密钥呢?令牌由您的应用程序生成,并在有限的时间内有效。通过这种方式,您可以共享访问权限,但不能获得对应用程序的访问权限。您使用用户名和密码(或keyfile)登录,并获得一个令牌,该令牌授予您访问权限,直到令牌被撤销。

最新更新