我继承了一个移动应用程序,它以明文形式发送身份验证凭据(用户 ID/密码)。
我想我有两个选择:a)使用 TLS。b) 编写我自己的身份验证协议。
如果我选择 (b) 我必须遵循哪些关键准则才能使其安全。例如如何避免重放攻击,加密策略。
如果您使用 b),关键准则是:不要。如果您希望它安全,那就是。
尝试坚持 a)。
没有必要编写自己的安全协议,而且是个坏主意。它几乎肯定会有可利用的缺陷。如果您只需要保护登录凭据的机密性,那么您应该使用 SSL/TLS。它还允许您在将来更轻松地升级到基于客户端证书的身份验证。
对于(b)我猜你做了一个挑战 - 响应的事情。
服务器生成一个随机字符串,发送给客户端。客户端将其附加到密码并散列整个内容,将散列发送回服务器。服务器执行相同的计算,将结果与从客户端获得的结果进行比较。如果它们匹配,则客户端发送正确的密码。
最明显的漏洞是,如果有人窥探交换双方,他们就可以对密码进行离线字典攻击。
对于“安全”的“您不能因此而被起诉”和“受到合理保护”的定义,对于移动应用程序,您可以假设该线路是安全的,而不是中间人攻击,并且对窃听是开放的. SSL/TLS 听起来是最简单的方法,但这可能取决于您的运营商和目标手机。
如果您无法使 TLS 工作并且您需要自己推出,请使用Diffie-Hellman密钥交换和已建立的加密库(弹性城堡军团有一个符合 J2ME 的轻量级实现。)