我不知道该怎么说这个问题,如果它与其他内容重复,请提前道歉。
我想要理智地检查我是如何保护我的基于扭曲的应用程序并认为我已经做得很好,但是自从我编写了使用原始套接字或托管套接字的内容以来已经过去了十多年。
身份验证事务: 客户端连接并立即使用16个字符的十六进制字符串发送质询响应。 客户端采用用户名和密码,密码转换为sha1(salt + sha1(密码)),凭据以{username,password}的形式发送回服务器。在服务器端,身份验证执行标准查找模式(如果用户存在且密码等于输入,则授予)。
如果用户与用户之间的连接客户端丢失,协议类将自身标记为脏,并将自己与用户对象断开连接。在此之后的任何时候,为了再次访问用户对象,客户端必须使用新的盐重复身份验证过程。
我错过了什么吗?基于字符流的协议是否有更好/更安全的方法?
答案 0 :(得分:6)
您描述的协议解决了一次攻击,即重放攻击。但是,您很容易受到MITM攻击。当攻击者进入协议时,TCP连接不会丢失。通过该系统传输的任何东西都可以被嗅探。如果您在咖啡馆的无线网络上,该区域的每个人都将能够嗅探传输的所有内容,然后MITM经过身份验证的会话。另一点是sha1()被证明是不安全的,你应该使用sha256来解决任何安全问题。
永远不要重新使用轮子,特别是在安全方面。
使用SSL!每个人都使用SSL,它有一个久经考验的secuirty历史,这是你无法建立的。 SSL不仅解决了中间攻击中的人,而且您还可以使用证书而不是密码来验证客户端和服务器,这使您免受暴力攻击。在攻击者强行获得2048位RSA证书之前,太阳将会燃尽。父亲,你不必担心前夕滴管嗅探传输。
请记住,OpenSSL是免费的,生成证书是免费的,证书的唱歌是免费的。虽然您想要签署证书的唯一原因是您希望实施PKI,这可能不是必需的。客户端可以对服务器的公钥进行硬编码以验证连接。服务器可以具有客户端公钥的数据库。该系统将是自包含的,不需要OCSP或CRL或公钥基础结构的任何其他部分。
答案 1 :(得分:1)
您的身份验证看起来很可靠但容易出现man in the middle attacks,因为它无法确保与服务器连接的完整性。
我建议改为实施SRP 6协议。它被证明是安全的,可确保连接的完整性,甚至可以创建一个可用于建立某种形式对称加密的公共秘密。该协议初看起来有点困难,但实际上很容易实现。 project website上还提供了一个JavaScript Demo,并链接到不同语言的多个实现。