字符串协议安全基本知识

5 投票
2 回答
818 浏览
提问于 2025-04-15 18:36

我不太确定该怎么问这个问题,所以如果这和其他问题重复了,先说声抱歉。

我想检查一下我为我的基于Twisted的应用程序做的安全措施,觉得自己做得还不错,但自从我写过使用原始或管理套接字的代码已经有十多年了。

身份验证过程: 客户端连接后,立刻会收到一个带有16个字符的十六进制字符串的挑战响应。 客户端会输入用户名和密码,密码会经过处理,变成sha1(盐 + sha1(密码)),然后以{用户名, 密码}的形式发送回服务器。在服务器端,身份验证会按照标准的查找模式进行(如果用户存在且密码与输入的相同,则允许访问)。

如果用户和客户端之间的连接断开,协议类会标记自己为“脏”,并与用户对象断开连接。从那时起,如果想再次访问用户对象,客户端必须用新的盐值重复身份验证过程。

我是不是漏掉了什么?对于基于字符流的协议,有没有更好或更安全的方法?

2 个回答

1

你的认证方式看起来很不错,但容易受到中间人攻击,因为它没有确保与服务器之间连接的安全性。

我建议你使用SRP 6协议。这个协议被证明是安全的,它能确保连接的完整性,还能生成一个共同的秘密,用来建立某种对称加密。虽然这个协议一开始看起来有点复杂,但其实实现起来相当简单。在项目网站上还有一个JavaScript演示,以及不同语言的多个实现链接。

6

你描述的协议解决了一个攻击方式,就是重放攻击。但是,你的系统对中间人攻击(MITM)非常脆弱。当攻击者介入这个协议时,TCP连接不会断开。而且,通过这个系统传输的任何东西都可能被监听。如果你在咖啡馆的无线网络上,周围的人都能监听到你传输的所有内容,然后进行中间人攻击。还有一点,sha1()已经被证明不安全,你应该使用sha256来处理任何与安全相关的事情。

千万不要重复造轮子,尤其是在安全方面。

使用SSL!大家都在用SSL,它有着悠久的安全历史,这是你自己无法建立的。SSL不仅解决了中间人攻击的问题,还可以用证书代替密码来验证客户端和服务器,这样就能抵御暴力破解。攻击者想要暴力破解一个2048位的RSA证书,太阳都要先熄灭。更重要的是,你不需要担心有人监听你的传输。

记住,OpenSSL是免费的,生成证书也是免费的,签署证书也不需要花钱。虽然你想要签署证书的唯一原因可能是想实现一个公钥基础设施(PKI),但这可能并不必要。客户端可以将服务器的公钥硬编码,以验证连接。服务器可以有一个客户端公钥的数据库。这个系统是自给自足的,不需要OCSP、CRL或其他任何公钥基础设施的部分。

撰写回答