我想进行基于表单的身份验证。 我应该(使用公钥/私钥)签署基于表单的身份验证(没有SSL)吗?
我知道它不会避免中间人攻击,但至少如果我将其隐藏在签名中,它将保护密码的价值。
签署表单身份验证是否无用?没有SSL进行身份验证的最佳方法是什么?
像Heroku这样的地方是否免费提供SSL?我只是在玩,试着学习很酷的东西,不想付钱:(
[UPDATE] : 以非常简洁的方式,我希望通过HTTP以最小的安全性启动和维护一个简单的会话。我怎样才能做到这一点?主要要求是避免未经身份验证的用户向REST API发出可能会更改服务器上某些内容的请求。
答案 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
计算HMAC,其中:
将HMAC作为请求参数附加。
在服务器上:
从请求中删除HMAC。
从请求中提取N.
验证N(见下文)。
如上所述计算S.
找到客户的K。
如上所述计算HMAC。
将计算出的HMAC与请求中的HMAC进行比较。
这意味着:
然而,观察者可以捕获并重放该请求。这是nonce进来的地方:
如果您使用基于时间的随机数
如果您使用随机nonce,那么服务器必须记住历史nonce并拒绝任何带有先前见过的nonce的新请求。
更好:使用时间窗/和/随机数。然后服务器只记住当前时间窗口内的nonce。
当然,这需要同步时钟和一个不错的随机数源,并且不提供机密性......