离线Android应用程序的密码保护[重复]
Posted
技术标签:
【中文标题】离线Android应用程序的密码保护[重复]【英文标题】:Password protection for offline android apps [duplicate] 【发布时间】:2017-11-26 03:35:33 【问题描述】:我最近了解到,要安全地存储密码,您应该使用带盐的慢速加密散列函数,并将散列后的密码和盐存储在某些服务器中。
但是我应该如何为离线应用程序安全地存储密码?恐怕如果有人拿到了用户的手机,他们可以通过 root 手机来获取存储所有敏感信息的文件,并获取哈希、用于哈希的盐,或者只是用他们自己的替换哈希密码哈希密码。有没有什么技巧可以让我的离线应用程序的密码更安全地存储?
编辑:澄清一下,我更感兴趣的是保护用户密码而不是进入应用程序。
【问题讨论】:
哈希密码并将其存储在您的 sqlite dB 中,一切都很好。即使有人掌握了散列密码,这对他们来说也是无用的,如果他们对它进行脾气暴躁,那么他们将无法在您的应用中使用密码 仅使用散列函数是不够的,仅添加盐对提高安全性无济于事。而是使用随机盐迭代 HMAC 约 100 毫秒的持续时间,然后将盐与哈希一起保存。使用PBKDF2
、Rfc2898DeriveBytes
、password_hash
、Bcrypt
等函数或类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。
@zaph 是的,这就是我所说的慢速加密哈希函数的意思。我担心如果他们得到盐(因为我必须将它存储在手机中),他们可能只是使用附加盐的字典攻击来在合理的时间跨度内获取密码,或者这不是问题吗?
@zaph 另外,由于我必须将哈希存储在手机上的某个位置,如果攻击者找到它,攻击者是否可以通过更改存储它的哈希来更改密码?他们不会得到这样的密码,但它似乎是一种通过锁屏的简单方法......假设它是可能的。
“越过锁屏”是指您的 iPhone 锁屏应用吗?攻击者是 iPhone 所有者还是其他人?您是否担心越狱的 iPhone?您需要定义威胁模型。
【参考方案1】:
散列密码通常存储在服务器上,因为这是对明文密码进行散列并与存储的散列进行比较的地方。您不传输散列密码。
如果您担心保护手机上的数据,则无需将密码以任何形式存储在任何地方。使用密码作为种子生成加密密钥。每当用户想要访问数据时,让他们输入密码并使用相同的算法重新生成密钥。
【讨论】:
但是我仍然需要将生成的加密密钥存储在手机中的某个地方,对吧?所以我可以将重新生成的密钥与第一个生成的密钥进行比较。这真的比存储哈希更安全吗?假设我理解正确。 @AMVaddictionist 您无需将密码或从中生成的加密密钥与任何内容进行比较。只需尝试解密您的数据。如果解密成功,您就会知道密码是正确的,也就是说,如果解密的数据是您期望的格式。 我不明白,我应该解密什么?我不认为你的意思是我应该解密加密密钥。你是说我应该生成一个密钥然后用那个密钥来加密密码吗?然后我是否应该将此加密值存储在某个地方,如果不是,我应该如何处理它?因此,当用户输入密码时,会生成一个新密钥,如果我用新生成的密钥解密存储的加密值并获得正确的密码,我应该允许输入吗? @AMVaddictionist 您询问有关保护“存储所有敏感信息的文件”的问题。加密那些。如果用户输入正确的密码,他们将能够解密它们。如果他们输入错误的密码,他们只会看到垃圾。 好吧,私人图片不能用于访问您的电子邮件,而密码可能可以。但这已经离题了。以上是关于离线Android应用程序的密码保护[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在asmack,android中让用户在线或离线[重复]