初始说明:这仅适用于个人修补项目;我不是在这里写企业安全,如果我是,我会知道最好不要尝试编写自己的方案。:-D
编辑:为了强调上述观点,我试图在“iKnowThisWouldBeABadIdeaInRealLife”下标记它,但 SO 不会接受它,因为它是 >25 个字符。请注意,我知道它不是商业级的!
我需要一种通过 HTTP 对用户进行身份验证的方法(在这种情况下不能使用 HTTPS)。我需要知道另一端的人真的是他们所说的那个人(以相当高的信心)。一旦我确定用户是合法的,我就不关心客户端和服务器之间的内容是否以明文形式发送。
我正在查看的问题是尝试将密码从客户端发送到服务器而不以明文形式发送。我考虑过在 javascript 中尝试一些公钥加密,因为一些谷歌搜索已经出现了一些看起来很有趣的库。
这是我正在考虑的方案:
(假设A和A'分别代表私钥和公钥;另外,enc(text, key)和dec(cyphertext, key)代表加密/解密函数)
+------------------------+------------------------------+
| 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() | |
+------------------------+------------------------------+
我在这方面看到的一个弱点是,正在收听交换的 BAD GUY,虽然他没有A,但现在有一个已知的密文/明文组合,我记得在加密课程中是BAD IDEA。我想一些盐可以以某种方式缓解这种情况?
所以这是我的[两个]问题:
- 这是一个“好”的计划吗?(请记住,我不在乎此初始交换之后的任何内容是否是明文 - 我只是在这里尝试验证初始身份)
- 解决上述“已知明文/密文对”弱点的最佳方法是什么?盐?
谢谢!
编辑: 感谢所有讨论!只是为了澄清:
- 我不担心向客户保证服务器就是他们所说的那个人。只有相反(向服务器保证客户是他们所说的人)
- 我知道 MITM 攻击。该方案并非旨在防止它们。
- 我知道已经有很多解决方案。这对我来说纯粹是一个学习练习!我并不是要重新发明轮子或制造更好的捕鼠器。这只是为了好玩!
这是我对该方案的思考过程:(我知道我并没有正确使用公钥和私钥,但请耐心等待)
鲍勃走到爱丽丝面前说:“嘿,我是鲍勃。”
爱丽丝说:“好的。我知道鲍勃的‘私钥’。如果你真的是鲍勃,请拿走我刚刚加密的这条秘密消息(用鲍勃的私钥),然后为我解密。”
Bob 回复了正确的消息,Alice 很高兴。