我正在利用JAVA KeyStore类为诸如Dropbox之类的东西存储我的用户OAUTH令牌。
它按原样工作,但是我担心它的安全性,因为我对它的存储方式或存储位置知之甚少。
http://www.howtobuildsoftware.com/index.php/how-do/ZPR/c-android-xamarin-monodroid-sqlcipher-correct-way-to-store-encryption-key-for-sqlcipher-database
我基于上面的示例创建代码,未提供一件事是为什么密码字段为空。
所以我的问题是,这应该为空吗?还是应该包含我的应用程序专用的密码(如果是后者),我应该在哪里保护我的应用程序密码,因为我在这里遇到了麻烦。
缺口。
最佳答案
没有提供的一件事是为什么密码字段为空。
该实现中的问题在于应使用什么“密码”。
我在这里有点鸡和蛋的情况。
如果在应用程序中对密码进行了硬编码,则最好使用null
(恕我直言...,但是我已经与安全研究人员合作,并且看到了他们的工具包,并且为方法调用提供的硬编码密码的工作时间不到2分钟让他们破解,因此我可以想象黑客可以在更短的时间内获得它(),就像通过非安全通道从Web API动态检索“密码”一样。
注意:并不是说使用Null / blank密码是可以的,不是,请继续阅读。
提示用户在每次使用密钥库之前输入密码(以滑动模式,密码短语,大头针等形式)将使该实现方式“更安全”,但是以用户易用性为代价,只有您自己并且您的用户可以确定该应用的用例。就个人而言,当我的银行应用程序提示我输入密码并通过短信和另一个密码输入来验证该访问权限时,我会喜欢它,但这可能仅是我自己。 😂
仅供参考:对于大多数黑客和研究人员而言,仅通过一个应用程序和密码就能够为多个站点昵称您的用户的OAUTH令牌非常诱人。
它按原样工作,但我担心安全性
你应该的。 😜
您所指的实现,恕我直言,非常薄弱。至少,它应该检查并使用Android Keystone提供程序(AndroidKeyStore
)应用是否至少在API级别18上运行。如果您的应用仅支持18+(或在18+设备上运行),则应不要维护您自己的密钥库文件(再次恕我直言...,但我无法想象安全研究人员会不同意,但如果他们认为您愿意,他们希望听到他们的说法)。
使用密钥库提供程序会使您和您的应用在操作系统执行操作时无法创建/维护/保护该密钥库文件,并且使用用户的令牌/密码/密码/ pin /锁模式/等...来保护实际的文件存储库本身。没有更多的鸡蛋问题。
当然,这并不涵盖您的应用检查根设备的执行情况,恶意应用的安装,当前的安全漏洞利用测试,未打补丁的安全补丁和/或缺少的安全补丁等……但这至少是一个开始。 (我曾在一些非常安全的devops环境中工作)。
同样,该实现方式也不是在检查安全硬件。即。 KeyInfo.IsInsideSecurityHardware,KeyInfo.IsUserAuthenticationRequirementEnforcedBySecureHardware等...
Google提供了一些很好的密钥库培训材料,涵盖了诸如密钥库提供商之类的主题:
https://developer.android.com/training/articles/keystore#java