如何在安卓系统上隐藏公钥?

4

Android安全手册指出,将公钥(用于Android市场)仅作为字符串保存并不安全,应该以某种方式隐藏/编码。 请问有人可以提供一些示例吗?

(我没有单独的服务器,因此无法在那里存储)

更新。 相信,这是一个相当常见的任务,不仅与Android有关,而且与其他应用程序也有关。


你确定你不是说 私钥 吗?攻击者几乎无法使用公钥。 - artbristol
2
我在谈论来自发布者账户的公钥。http://developer.android.com/guide/market/billing/billing_integrate.html: 为了保护你的公钥不被恶意用户和黑客攻击,不要将你的公钥作为一个完整的字符串嵌入代码中。相反,可以在运行时从多个部分构建该字符串,或使用位操作(例如,与其他字符串进行异或运算)来隐藏实际密钥。密钥本身并不是机密信息,但你不希望让黑客或恶意用户轻易地替换公钥。 - LA_
2
你可以尝试在http://security.stackexchange.com/上询问。那里有一些真正的专家... - AviD
公钥意味着它们是“公开的”,可以重新分发、共享等等,因此被称为公钥。 - Tito
1
没错,但你不想让别人轻易地用另一个公钥替换它。 - Oleg Vaskevich
3个回答

1

你所链接的页面中的相关文本如下:

重要提示:为了保护公钥不被恶意用户和黑客攻击,不要将公钥作为整个字符串嵌入代码中。相反,应该在运行时从各个部分构建字符串或使用位操作(例如与其他字符串进行异或运算)来隐藏实际密钥。密钥本身并不是机密信息,但您不希望让黑客或恶意用户轻易地替换公钥。

这就是你需要知道的全部内容。让别人知道你的公钥并没有什么危害,真正的危害在于有人会试图用自己的公钥替换你程序中的公钥,以此来转移应用内购买到他们自己的账户。

他们建议你将密钥存储在单独的部分中或者将密钥与其他字符串进行异或运算,以增加攻击者的难度。现在,攻击者不仅需要覆盖你的密钥,还需要找出你对字符串所做的变换,并使自己的密钥适应这种模式。这需要更多的工作量,可能会阻止一些普通的攻击者,但无法防止真正有决心的攻击者。


1
我真的不太理解这个。所以,与其使用String base64EncodedPublicKey =“thisIsMyKey”;,使用String one =“thisIs”; String two =“MyKey”; String base64EncodedPublicKey = one + two;更安全吗? - Kalina
2
@TheBeatlemaniac,他们建议的最低要求大致是这样的。攻击者拥有自己的公钥,想要找到你的公钥并将其替换为自己的。您在分割和操作密钥方面越多,攻击者需要进行的工作就越多。但正如我所说,所有这些都无法阻止一个真正决心的攻击者。 - Kevin

0
如果您使用Keytool实用程序,则所有这些都将为您完成。您将在本地计算机上获得一个包含已加密密码的私钥的.keystore文件;保持该文件和密码的机密性,您就可以安全地使用它们了。

http://developer.android.com/guide/publishing/app-signing.html

事实上,我相信Eclipse的Android插件甚至可以自动为您完成所有这些工作。

请检查我对问题的第一个评论 - 我在谈论公钥。 - LA_

-3

在公钥上,您可以进行哈希处理并将其保存为哈希值。更好的做法是使用某些内容对哈希值进行加盐,以便在需要获取哈希值时您可以知道该内容。可能是用户名或ESN之类的内容。查看android.telephony.TelephonyManager.getDeviceId()。


2
这不是一个解决方案,因为他可能需要在某个时候获取公钥。单向哈希无法做到这一点。 - Falmarri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接