我们正在Android和iPhone上制作应用程序。一种方法是每次在本地设备和登录远程服务器中保存密码哈希(使用令牌)。另一种方法是登录一次,然后获取令牌与服务器通信。应用程序将令牌保存在设备中,因此如果用户不手动注销,则令牌将不会过期。 有些队友认为后一种方法更好,而不是在本地设备中保存密码哈希。但我认为保持令牌也是不安全的。有人可以给我们一些建议吗?
答案 0 :(得分:2)
我们可能需要更多细节来评估您正在考虑的内容。从理论上讲,要么建立得好。有几件事需要考虑。
首先,最好让您的身份验证令牌定期到期。这会关闭被盗令牌的窗口。
身份验证应始终是质询/响应,以避免重放攻击。您通常不应该发送令牌本身。您将回复发送给证明您拥有它的挑战。
当然,您从TLS开始作为传输层。理想情况下,您应该验证您的证书。只有这一点,这一点可以抵御各种各样的攻击。并非所有攻击; TLS不是魔法安全防尘,但它确实提供了非常好的“腰带和吊带”防御深度。
有趣的是你要保存“密码哈希”。你是如何使用它的?你是如何腌制它的?特别是,如果很多人都有密码“password1”,他们都会有相同的哈希吗?如果没有TLS,如果您通过网络发送哈希本身,这可能会让您遇到重大问题。
在iPhone上,您应该将敏感凭据存储在钥匙串中。 SFHFkeychainutils围绕钥匙链做了一个不错的包装(我用牛肉做了它,但没关系)。不幸的是,我不认为Android有类似的OS提供的凭证存储。 (不,iPhone的钥匙串不能防止各种攻击,但它确实提供了针对某些类型攻击的有用保护,值得使用。)
您希望协议能够取消验证被盗设备。这可以采取用户更改密码或撤销令牌的形式,但用户需要一种方法来实现此目的。
同样,很难评估一种广泛的,假设的安全方法。协议中的标记或密码都可以。重要的是协议的其余部分。
答案 1 :(得分:1)
分析这种方法的方法是假设设备上没有任何东西是安全的。那么问题就变成了,如果(当)设备受到损害,可能发生的最坏情况。如果保存令牌,则用户的凭据是安全的,您可以在服务器上实现撤消令牌的方法。如果您保存密码哈希,那么(如果我理解您的意思)用户将需要更改密码(可能需要撤销令牌)。
此外,如果您将令牌绑定到某种设备标识符,那么从其他设备使用令牌将更加困难。密码哈希(除非它还包括有关设备的数据)在其他设备上使用起来并不困难。 (这些攻击可在设备受到攻击之间以及在服务器上采取纠正措施之间提供。)
正如您可能猜到的那样,我同意您的同事关于这两种方法中的哪一种更好。 (我还应该明确指出,我认为这些方法中没有一种是最强大的方法。您可能需要做一些研究 - 搜索移动应用程序安全性以查找有关的大量信息不同的方法。)