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

时间:2014-03-10 10:23:27

标签: security authentication language-agnostic hmac

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

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

  2. 对于浏览器客户端,存储在cookie或其他形式的本地存储中的私钥是什么?即对于通用api令牌认证,令牌将存储在浏览器的cookie中和手机上的数据库中

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

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

  5. 我会使用Devise with Rails,但它要求你编写自己的令牌认证码。

    我也在关注OAuth,问题2和4都适用于,但我们真的想调查AWS方法。

1 个答案:

答案 0 :(得分:0)

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

我会尽力回答这个问题。

  1. 据我了解,私钥将派生出共享的公钥。或者您可以共享私钥,但只有在已经建立身份验证的情况下(换句话说:您已经确定您正在与谁通话)并且连接是安全的(加密的)。尽管如此,你仍然会在中间攻击中容易受到攻击。
  2. 我不确定。 Cookie不安全。窃取cookie,窃取私钥。我的偏好是本地存储的密钥(文件或存储),通过密码加密
  3. 你必须设计某种客户端库(用javascript或类似的东西)。
  4. 为什么在共享令牌时共享密钥,例如oAuth实现。令牌由您的应用程序生成,并且在有限的时间内有效。这样您就可以共享访问权限,但不能获取访问应用程序的方法。您使用用户名和密码(或密钥文件)登录,并获得一个授予您访问权限的令牌,直到令牌被撤销。