我最近开始了解Android应用中的安全性,并希望实施证书固定。通过谷歌搜索找到一些有用的信息,但我偶然发现存储密钥库密码,其中包含服务器证书。
因为我不能相信Android文件系统保密我的密钥库密码,主要是因为任何有根的用户最终都能挖出来,我开始怀疑是否它是真的需要安全地存储这个密钥库密码,因为这个密钥库只包含我的服务器的SSL证书,该证书是公开的。
如果有人可以反编译我的APK
并查看密钥库密码,我就无法考虑任何恶意攻击,因为攻击者无法修改任何密码应用程序的代码,因此更改,例如,目标服务器IP
甚至修改密钥库切换我的证书与一些其他恶意证书,结合攻击者可以对目标进行的更改IP
会使应用针对任何恶意服务器(man-in-the-middle-attack)工作。
我在Android here on github中找到了一个很好的证书固定示例,但遗憾的是作者并没有安全地存储密码,因为它是MainActivity
的硬编码。
所以我总结的问题是:如果该密钥库仅包含在预期的公共SSL
服务器证书中,是否真的需要保护密钥库密码?
根据我的研究,我发现on this question OP解决了将null
作为密码传递给Android代码的可能性。也许我可以使用它并将密钥库密码存储在我的服务器上,而不是将其打包在Android应用程序中。
同时在我的谷歌搜索中,我找到了相当有用的文章,对于将来对此问题的任何人都可能会感兴趣:
进度更新
- 将null
作为密钥库密码(如上所述作为其中一个选项)传递,如果您在生成密钥库时设置了密码存储密码,则会导致密钥库绕过:请求仍会被发送,而自定义密钥库则不会执行任何操作。没有抛出任何异常或其他任何异常,它就像您没有设置任何自定义密钥库一样。
KeyStore trustStore = KeyStore.getInstance("BKS");
trustStore.load(keyStoreInputStreamFromResources, null);