在我的应用程序中,我需要建立SSL 连接。目前,我有一个BKS类型的密钥库文件,但我不想将它作为文件存储在我的 apk 中。AFAIK 私钥可以作为字符串或其他内容嵌入应用程序代码中,然后可以对其进行混淆。所以我的问题是;
1) 真的有可能吗,是否比将其作为“mykey.bks”文件存储在我的资产文件夹中更安全?
2) 如何将我的 bks 文件的内容复制并粘贴到我的应用程序代码中,以及如何访问它以创建套接字工厂?
谢谢
在我的应用程序中,我需要建立SSL 连接。目前,我有一个BKS类型的密钥库文件,但我不想将它作为文件存储在我的 apk 中。AFAIK 私钥可以作为字符串或其他内容嵌入应用程序代码中,然后可以对其进行混淆。所以我的问题是;
1) 真的有可能吗,是否比将其作为“mykey.bks”文件存储在我的资产文件夹中更安全?
2) 如何将我的 bks 文件的内容复制并粘贴到我的应用程序代码中,以及如何访问它以创建套接字工厂?
谢谢
1)真的有可能吗,是否比将其作为“mykey.bks”文件存储在我的资产文件夹中更安全?
答案是否定的,因为任何人都可以使用 APK反编译器工具轻松地从 APK 中提取资产文件夹
解决方案:
一种)。将您的mykey.bks
文件放在安全服务器上
乙)。 通过在 C++ 或 C 中使用 getter 方法创建一个简单的类并在运行时返回服务器 URL,使用 JNI 保护服务器 url(避免从 apk 中提取文件 url)
C)。 当您需要在应用程序中使用时在运行时下载“mykey.bks”文件并在用户关闭您的应用程序时将其删除
如评论中所述,您希望将私钥保密,或者每个人都可以登录您的安全服务。(因此名称private key)
保持它真正私密的唯一方法是不将其传递给其他人。例如,您使用应用程序的 UI 提供私钥。如果此密钥不存在,则用户无法访问该服务!
在您目前的情况下,这似乎是不可能的,至少从它对您的问题的理解来看。因此,第二个最佳解决方案是密码保护密钥。但是随后您需要向您的用户提供密码,这与向您的用户提供密钥本身(上一个选项)完全相同......
更糟糕的选择是将密钥嵌入到您的应用程序/APK 中而不受密码保护。任何熟练的用户都可以使用与应用程序相同的算法来检索密钥:去混淆、下载、读取文件等。
The conclude, it seems silly that your service requires a private key, and your pass the key to (all? of) your users. So everyone is able to connect to the service... Why do you need the private key to access the service?
In the end the choice of the method to provide the key is yours!
UPDATE (was too long for a comment)
The general idea when using keys is, that the client has a (custom generated) private/public key-pair. next, the public key part is send to the service. And the client is able to authenticate using the private key (by proving that the client has indeed the private key part).
In your situation, you need to provide a method to send public keys to your storage/service. The problem is that you need to somehow verify that the public key belongs to a client you want to grant access. This could be manually verified by administrators... Otherwise anyone is still able create nonsense subscriptions.
To be more concrete for your own application. It could include a SSL public/private key-pair generator. After a new key-pair is generated, the public key could be send to your service from the application.
The service need to get it authenticated, until that moment the client could connect to the service (using the non-authenticated key-pair) to a read-only (guest) subscription (for example).
Again, the choice of the actual implementation is yours, these are only pointers.
This article is a good reference about storing private data in Android : http://nelenkov.blogspot.fr/2012/05/storing-application-secrets-in-androids.html