Authentication 我是否应该(使用公钥/私钥)签署基于表单的身份验证(无SSL)?
我想做一个基于表单的身份验证。 我是否应该(使用公钥/私钥)签署基于表单的身份验证(不使用SSL) 我知道它不会避免中间人攻击,但如果我将密码隐藏在签名中,它至少可以保护密码的值 在表单身份验证上签名没有用吗?没有SSL进行身份验证的最佳方法是什么 像Heroku这样的地方是否免费提供SSL?我只是在玩,想学一些很酷的东西,不想付钱:( [更新]:Authentication 我是否应该(使用公钥/私钥)签署基于表单的身份验证(无SSL)?,authentication,Authentication,我想做一个基于表单的身份验证。 我是否应该(使用公钥/私钥)签署基于表单的身份验证(不使用SSL) 我知道它不会避免中间人攻击,但如果我将密码隐藏在签名中,它至少可以保护密码的值 在表单身份验证上签名没有用吗?没有SSL进行身份验证的最佳方法是什么 像Heroku这样的地方是否免费提供SSL?我只是在玩,想学一些很酷的东西,不想付钱:( [更新]: 以一种非常简洁的方式,我想通过HTTP启动和维护一个安全性最低的简单会话。我该怎么做?主要要求是避免未经身份验证的用户向REST API发出可能会改
以一种非常简洁的方式,我想通过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作为请求参数
- 生成一个nonce N。这是:
- 在服务器上:
- 从请求中删除HMAC
- 从请求中提取N
- 验证N(见下文)
- 如上所述计算S
- 找到客户的K
- 如上所述计算HMAC
- 将计算的HMAC与请求中的HMAC进行比较
- 我必须知道K才能发出请求
- 攻击者无法在飞行中修改请求URL,因为这将使HMAC无效
- 如果使用基于时间的nonce,则
- 请求可以在时间窗口内重播
- 时间窗口必须足够大,以适应客户端和服务器之间的时钟差异以及网络延迟
- “验证”意味着服务器必须检查时间戳以确保它是“现在”
- 如果使用随机nonce,则服务器必须记住历史nonce,并拒绝使用以前看到的nonce的任何新请求
- 更好的方法是:使用一个时间窗口/和/一个随机数。然后服务器只记住当前时间窗口内的nonce