我应该(使用公钥/私钥)签署基于表单的身份验证(无SSL)吗?

时间:2014-03-07 13:00:21

标签: authentication

我想进行基于表单的身份验证。 我应该(使用公钥/私钥)签署基于表单的身份验证(没有SSL)吗?

我知道它不会避免中间人攻击,但至少如果我将其隐藏在签名中,它将保护密码的价值。

签署表单身份验证是否无用?没有SSL进行身份验证的最佳方法是什么?

像Heroku这样的地方是否免费提供SSL?我只是在玩,试着学习很酷的东西,不想付钱:(

[UPDATE] : 以非常简洁的方式,我希望通过HTTP以最小的安全性启动和维护一个简单的会话。我怎样才能做到这一点?主要要求是避免未经身份验证的用户向REST API发出可能会更改服务器上某些内容的请求。

2 个答案:

答案 0 :(得分:1)

我认为您实际上是在询问如何通过未加密的HTTP连接向服务器证明共享密钥(即用户名/密码)的知识?

基本规则1:不要滚动你自己的加密[图形协议]:如果你需要机密性和完整性(即加密和身份验证等),那么使用TLS / SSL,除非你聪明/知识渊博/经验丰富足以自己做。

基本规则2:在不首先了解您的安全要求的情况下,不要枚举算法/技术(例如公钥加密)并询问它们是否能解决您的问题。加密算法提供安全属性,如机密性。安全要求最终(根据某些分析)取决于某些此类属性。因此,适当的技术从安全要求/分析练习中退出,而不是相反。

回答你的直接问题:不,因为你刚刚用另一个秘密替换了一个秘密(因此没有解决你的问题),不考虑重播攻击,也不考虑混淆代表和连接劫持等事情。

如果您仍想自己动手,那么首先找出您的安全要求:您正在尝试向服务器验证客户端(即浏览器),但服务器是否必须向客户端证明其身份? 为什么您要进行身份验证?如果要授予对某些信息的访问权限,那么为什么然后立即以明确的方式发送该信息呢? (MITM与被动观察者不同。)做一些威胁建模。假设你对这一切都很好,你可能最终会发明一些看起来像HMAC的东西,它具有时间或服务器端状态以防止重放。你仍然有分享秘密或同意受信任的第三方的问题。

答案 1 :(得分:1)

假设您拥有客户端和服务器,因此可以轻松地在它们之间共享一个秘密(即一定数量的随机字节),并且尽管存在保密的问题,那么,假设您正在使用REST这样HTTP请求参数在URL中而不在正文中:

  • 发明共享密钥。我们称之为K.例如,生成128个随机位:

    dd if = / dev / random bs = 16 count = 1 | od -t x1

    (128位是否必要/足够?取决于您的要求......)

  • 每个请求:

    • 生成一个nonce N.这是:

      • 随机数。
      • 时间戳:秒 - 自 - 纪元/时间窗口大小 我们将回到时间窗口大小。
    • 将nonce添加为请求参数:

      http://foo.com/blah/blah?x=y@mood=dismal?N=0x123456789abcdef

    • 计算包含以下内容的字符串S

      • HTTP方法,例如GET,POST。
      • 完整的网址。
    • 计算HMAC,其中:

      • K是关键
      • 文本(即HMACed的内容)是S。
    • 将HMAC作为请求参数附加。

  • 在服务器上:

    • 从请求中删除HMAC。

    • 从请求中提取N.

    • 验证N(见下文)。

    • 如上所述计算S.

    • 找到客户的K。

    • 如上所述计算HMAC。

    • 将计算出的HMAC与请求中的HMAC进行比较。

这意味着:

  • 我必须知道K要发送请求。
  • 攻击者无法修改飞行中的请求网址,因为这会使HMAC无效。

然而,观察者可以捕获并重放该请求。这是nonce进来的地方:

  • 如果您使用基于时间的随机数

    • 可以在时间窗口内重播请求。
    • 时间窗口必须足够大,以适应客户端和服务器之间的时钟差异以及网络延迟。
    • “验证”表示服务器必须检查时间戳以确保它“现在”。
  • 如果您使用随机nonce,那么服务器必须记住历史nonce并拒绝任何带有先前见过的nonce的新请求。

  • 更好:使用时间窗/和/随机数。然后服务器只记住当前时间窗口内的nonce。

当然,这需要同步时钟和一个不错的随机数源,并且不提供机密性......