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

Authentication 我是否应该(使用公钥/私钥)签署基于表单的身份验证(无SSL)?,authentication,Authentication,我想做一个基于表单的身份验证。 我是否应该(使用公钥/私钥)签署基于表单的身份验证(不使用SSL) 我知道它不会避免中间人攻击,但如果我将密码隐藏在签名中,它至少可以保护密码的值 在表单身份验证上签名没有用吗?没有SSL进行身份验证的最佳方法是什么 像Heroku这样的地方是否免费提供SSL?我只是在玩,想学一些很酷的东西,不想付钱:( [更新]: 以一种非常简洁的方式,我想通过HTTP启动和维护一个安全性最低的简单会话。我该怎么做?主要要求是避免未经身份验证的用户向REST API发出可能会改

我想做一个基于表单的身份验证。 我是否应该(使用公钥/私钥)签署基于表单的身份验证(不使用SSL)

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

在表单身份验证上签名没有用吗?没有SSL进行身份验证的最佳方法是什么

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

[更新]
以一种非常简洁的方式,我想通过HTTP启动和维护一个安全性最低的简单会话。我该怎么做?主要要求是避免未经身份验证的用户向REST API发出可能会改变服务器上某些内容的请求。

我想你本质上是在问如何证明对共享秘密的了解(即用户名/密码)通过未加密的HTTP连接连接到服务器

基本规则1:不要使用自己的加密[图形协议]:如果您需要保密性和完整性(即加密和身份验证等),则使用TLS/SSL,除非您足够聪明/知识丰富/经验丰富,可以自己使用

基本规则2:不要列举算法/技术(如公钥密码术)并询问它们是否能解决您的问题,而不首先了解您的安全要求。密码算法提供保密性等安全属性。安全要求最终(经过一些分析)因此,适当的技术从安全需求/分析练习中退出,而不是相反

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


如果您仍然想要自己的应用程序,那么首先确定您的安全要求:您正在尝试验证客户端(即浏览器)到服务器,但服务器是否必须向客户端证明其身份?为什么要进行身份验证?如果要授予对某些信息的访问权限,那么为什么要在验证后立即以明文形式发送该信息?(MITM与被动观察者不同。)做一些威胁建模。假设你对所有这些都没问题,你可能最终会发明一种类似于HMAC的东西,具有时间或服务器端状态,以防止重播。但是,你仍然存在共享秘密或与可信的第三方达成协议的问题。

假设你拥有客户端和服务器,因此,它们之间可以轻松地共享一个秘密(即一些随机字节数),尽管存在保密问题,但假设您正在使用REST,使得HTTP请求参数位于URL中而不是正文中:

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

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

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

  • 每项请求:

    • 生成一个nonce N。这是:

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

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

      • HTTP方法,例如GET、POST
      • 完整的URL
    • 计算HMAC,其中:

      • K是关键
      • 文本(即正在填充的内容)为S
    • 附加HMAC作为请求参数

  • 在服务器上:

    • 从请求中删除HMAC

    • 从请求中提取N

    • 验证N(见下文)

    • 如上所述计算S

    • 找到客户的K

    • 如上所述计算HMAC

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

这意味着:

  • 我必须知道K才能发出请求
  • 攻击者无法在飞行中修改请求URL,因为这将使HMAC无效
但是,观察者可以捕获并重播请求。这就是nonce的作用:

  • 如果使用基于时间的nonce,则

    • 请求可以在时间窗口内重播
    • 时间窗口必须足够大,以适应客户端和服务器之间的时钟差异以及网络延迟
    • “验证”意味着服务器必须检查时间戳以确保它是“现在”
  • 如果使用随机nonce,则服务器必须记住历史nonce,并拒绝使用以前看到的nonce的任何新请求

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

当然,这需要同步时钟和一个像样的随机数源,而且不提供机密性…

谢谢:)这是两条需要遵循的好规则,我理解你的观点,你是对的。我想为一个爱好项目做一个简单的登录,所以我不想为任何SSL证书付费。同时,通过帖子发送一个清晰的密码没有多大意义,我如何避免这种情况。我想以一种非常简洁的方式开始并维护一个简单的ses通过HTTP实现最低安全性的sion。我如何做到这一点?主要要求是避免未经身份验证的用户向REST API发出请求,这可能会改变服务器上的某些内容。谢谢:)这是一个非常好的答案,这为我留下了很多学习和学习的内容。我知道我