1

我最近开始了解 Android 应用程序的安全性,并希望实现证书固定。通过谷歌搜索找到了一些有用的信息,但我偶然发现了存储包含服务器证书的密钥库密码。

由于我不能信任 Android 文件系统来保密我的密钥库密码,主要是因为任何 root 用户最终都可以将其挖掘出来,我开始怀疑是否真的需要安全地存储此密钥库密码,因为此密钥库将仅包含我的服务器的 SSL 证书,该证书旨在公开。

如果有人可以反编译我并看到密钥库密码,我想不出任何恶意攻击APK,因为攻击者将无法修改任何应用程序的代码,从而更改目标服务器IP,甚至修改密钥库用其他恶意证书切换我的证书,结合攻击者可能对目标所做的更改IP,将使应用程序针对任何恶意服务器(中间人攻击)工作。

我在 github 上找到了一个在 Android 中固定证书的非常好的示例,但遗憾的是作者并没有费心安全地存储密码,因为它是硬编码在MainActivity.

所以我总结的问题是:如果密钥库只有在预期的公共SSL服务器证书中,是否真的需要保护密钥库密码?

从我所做的研究中,我发现在这个问题null上,OP 解决了在 Android 代码上作为密码传递的可能性。也许我可以使用这个并将密钥库密码存储在我的服务器上,而不是将其打包在 Android 应用程序中。


同样在我的谷歌搜索过程中,我发现了非常有用的文章,对于将来研究这个问题的人来说可能会很有趣:


进度更新 - 作为密钥库密码传递null(正如我上面提到的选项之一),如果您在生成它时设置了一个,将导致密钥库绕过:无论如何都会发送请求,而自定义密钥库什么也不做。没有抛出异常或任何东西,它就像您没有设置任何自定义密钥库一样工作。

 KeyStore trustStore = KeyStore.getInstance("BKS");
 trustStore.load(keyStoreInputStreamFromResources, null);
4

0 回答 0