Security 通过HTTP(而不是HTTPS)对用户进行身份验证
初始注释:这只是一个个人修补项目;我不是在这里写企业安全,如果是的话,我知道最好不要写我自己的方案-D 编辑:为了强调上述观点,我尝试将其标记在“IknowThisWouldbadeainRealLife”下,但因此不接受,因为它大于25个字符。请注意,我知道这不是商业级的 我需要一种通过HTTP对用户进行身份验证的方法(在这种情况下不能使用HTTPS)。我需要知道另一端的人真的是他们所说的那个人(在某种相当高的信心程度上)。一旦我确定用户是合法的,我就不在乎客户端和服务器之间的内容是否以明文形式发送 我看到的问题是,试图将密码从客户端发送到服务器,而不是以明文形式发送。我曾经考虑过在javascript中尝试一些公钥加密,因为一些谷歌搜索发现了一些有趣的库 以下是我正在考虑的方案: (假设A和A'分别表示私钥和公钥;enc(text,key)和dec(cyphertext,key)表示加密/解密函数)Security 通过HTTP(而不是HTTPS)对用户进行身份验证,security,cryptography,public-key-encryption,Security,Cryptography,Public Key Encryption,初始注释:这只是一个个人修补项目;我不是在这里写企业安全,如果是的话,我知道最好不要写我自己的方案-D 编辑:为了强调上述观点,我尝试将其标记在“IknowThisWouldbadeainRealLife”下,但因此不接受,因为它大于25个字符。请注意,我知道这不是商业级的 我需要一种通过HTTP对用户进行身份验证的方法(在这种情况下不能使用HTTPS)。我需要知道另一端的人真的是他们所说的那个人(在某种相当高的信心程度上)。一旦我确定用户是合法的,我就不在乎客户端和服务器之间的内容是否以明文形
+------------------------+------------------------------+
|服务器|客户端|
+------------------------+------------------------------+
(1) | t=randomToken()|
(2) |附录(t,A)--->c|
(3) | | A'=getKeyFromUser()|
(4) | p您可以使用。大多数浏览器、服务器和各种库都已经支持这一点
编辑:
如果您真的想在没有SSL/TLS的情况下使用公钥加密,您可以看看
如果你真的想发明你自己的身份验证方案,你应该注意你的标签上的加密/解密错误(不确定这是否是打字错误,或者可能我没有正确阅读图表,看起来你在服务器端做enc(t,a):
- 您可以使用公钥进行加密
- 您可以使用私钥进行解密
- 您使用私钥进行签名
- 您可以使用公钥验证签名
在您的方案中,您需要服务器发布其公钥,并让客户端使用该公钥加密其答案,然后将其发送到服务器,然后服务器将能够使用其私钥对其进行解密。然后,难点在于确保公钥确实是合法服务器的公钥,并且它没有被中间的攻击者截获和替换:这就是PKI和证书与TLS(和HTTPS)一起起作用的地方。您基本上想要在HTTP上实现SSL;这在某种程度上是可行的,但永远不会像真实的东西那么好
能够来回发送加密数据只是问题的一半。问题的另一部分是确保你实际上是在与服务器对话(想想中间人的攻击)。
我不确定SSL是如何工作的,但这是一条路要走。你应该好好读一读。然而,从你的计划看来,这似乎毫无意义。为什么要将明文发送回服务器?这违背了设立这一机构的目的
我会这样做:
服务器向客户端发送一个随机令牌。服务器将令牌存储在“挂起”列表中。可在一定时间间隔内(例如:每15分钟)清除一次
客户端将enc(comb(用户名、密码、令牌)、公钥)
发送回服务器,其中comb()
是一个结合用户名、密码和随机令牌的函数
服务器使用decomb(dec(message,privKey))
返回用户名和密码,其中decomb()
与comb()相反李>
服务器检查令牌是否存在于挂起列表中。如果不是,请拒绝登录尝试。如果是,it服务器可以像往常一样继续执行身份验证
如果生成的令牌从未重复,攻击者就不能重新发送相同的加密消息,也不能解密消息以查明所有内容。假设您的客户端和服务器在此交换开始之前交换公钥,您可以执行以下操作:
客户机发送HTTP请求,请求头包含用户名和加密(私钥、用户+URL)
服务器尝试使用指定用户的公钥解密标头的内容
如果解密失败,或者包含的用户或URL不匹配,则请求将被拒绝
包含URL是为了防止针对不同资源的重播攻击。通过在加密数据中包含时间戳,可以获得更高的重播安全性
如果您使用高质量的加密方案,那么已知的明文攻击就不是一个大问题
编辑:删除了对AES128的提及。就像布鲁诺说的那样,你所描述的内容符合HTTP摘要的内容,这是非常安全的。但是,如果你仔细阅读,就会发现有一些环洞。不大。有人真的需要倾听,等待拿起握手中的钥匙才能破门而入。如果安全性是一个问题,您必须使用https并为其让路。这就是它存在的原因。https具有证书,可以使握手在一开始就抵抗窃听者。首先,https的作用不仅仅是加密。它还可以防止活动的MTIM攻击并保护您的会话id。如果您只是泄漏会话id,则密码毫无意义。这是OWASP A9的一部分
然而,有人已经实现了一种新的方法。它对会话id和密码进行加密。它使用Diffie-Hellman密钥交换,类似于SSL。即使
+------------------------+------------------------------+
| SERVER | CLIENT |
+------------------------+------------------------------+
(1) | t = randomToken() | |
(2) | enc(t, A) --------> c |
(3) | | A' = getKeyFromUser() |
(4) | p <-------- p=dec(c, A') |
(5) | if (t==p) | |
| allowAccess() | |
| else | |
| denyAccess() | |
+------------------------+------------------------------+