将私钥嵌入Android中的应用程序代码中

时间:2013-03-15 09:13:56

标签: android ssl private-key

在我的应用程序中,我需要建立 SSL连接。目前,我有一个 BKS 类型的密钥库文件,但我不想将它作为文件存储在我的apk中。 AFAIK私钥可以作为String或其他东西嵌入应用程序代码中,然后可以对它们进行模糊处理。所以我的问题是;

1)它真的可能并且比将它作为“mykey.bks”文件存储在我的资产文件夹中更安全吗?

2)如何将我的bks文件的内容复制并粘贴到我的应用程序代码中,如何访问它以创建套接字工厂?

由于

3 个答案:

答案 0 :(得分:4)

1)它是否真的可以,并且比将其作为“mykey.bks”文件存储在我的资源文件夹中更安全?

答案是否定的,因为任何人都可以使用APK 反编译器工具

轻松地从APK中提取资源文件夹

解决方案:

a)。将您的mykey.bks文件放在安全服务器上

b)。使用JNI安全服务器URL,方法是在C ++或C中使用getter方法创建一个简单的类,并在运行时返回服务器URL(以避免从apk中提取文件URL)

c)。在运行时下载“mykey.bks”文件,当您需要在应用程序中使用并在用户关闭您的应用程序时将其删除

答案 1 :(得分:1)

如评论中所述,您希望私钥保密,或者每个人都可以登录您的安全服务。 (因此名称​​私钥

保持私密性的唯一方法是不将它传递给其他人。例如,您使用应用程序的UI提供私钥。如果此密钥不存在,则用户无法访问该服务!

在你目前的情况下,这似乎是不可能的,至少从它对你的问题的理解。所以第二个最佳解决方案是密码保护密钥。但是,您需要为用户提供密码,这与向用户提供密钥本身相同(之前的选项)......

更糟糕的选择是将密钥嵌入到您的应用程序/ APK中,而不受密码保护。任何熟练的用户都可以使用与应用程序使用相同的算法来检索密钥:反混淆,下载,读取文件等。

结论是,您的服务需要私钥,并将密钥传递给(所有)用户,这似乎很愚蠢。所以每个人都能够连接到服务......为什么需要私钥来访问服务?

最后选择提供密钥的方法是你的!


更新(评论时间过长)

使用密钥时的一般想法是,客户端具有(自定义生成的)private/public key-pair。接下来,将公钥部分发送给服务。并且客户端能够使用私钥进行身份验证(通过证明客户端确实具有私钥部分)。

在您的情况下,您需要提供一种方法来将公钥发送到您的存储/服务。问题是您需要以某种方式验证公钥是否属于您要授予访问权限的客户端。这可以由管理员手动验证......否则任何人仍然可以创建无意义的订阅。

为您自己的应用程序更具体。它可能包括SSL公钥/私钥对生成器。生成新密钥对后,可以从应用程序将公钥发送到您的服务。

服务需要对其进行身份验证,直到客户端可以连接到服务(使用未经身份验证的密钥对)到只读(guest)订阅(例如)。

同样,实际实现的选择是你的,这些只是指针。

答案 2 :(得分:1)

本文是关于在Android中存储私人数据的一个很好的参考:http://nelenkov.blogspot.fr/2012/05/storing-application-secrets-in-androids.html