好问题。
公钥必须在设备上可用才能使用。一旦它出现在设备上,它就不再受到真正的保护。密钥本身并不是秘密,但我们需要使其可能的替换成为一项更困难的任务。
您可以做的是使用所谓的 XOR 加密。这是 XOR 加密器和解密器方法的示例。
public static String xorEncrypt(String input, String key) {
byte[] inputBytes = input.getBytes();
int inputSize = inputBytes.length;
byte[] keyBytes = key.getBytes();
int keySize = keyBytes.length - 1;
byte[] outBytes = new byte[inputSize];
for (int i=0; i<inputSize; i++) {
outBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keySize]);
}
return new String(Base64.encode(outBytes, Base64.DEFAULT));
}
public static String xorDecrypt(String input, String key) {
byte[] inputBytes = Base64.decode(input, Base64.DEFAULT);
int inputSize = inputBytes.length;
byte[] keyBytes = key.getBytes();
int keySize = keyBytes.length - 1;
byte[] outBytes = new byte[inputSize];
for (int i=0; i<inputSize; i++) {
outBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keySize]);
}
return new String(outBytes);
}
您需要如何选择一个密码字符串 ( String key
) 并使用它加密您的公钥 ( String input
)。您可以将此加密密钥存储在一个类中。当您需要真正的密钥值时,您可以xorDecrypt()
使用密码和公共(加密)密钥字符串进行调用。密码也是您存储在代码中某处的字符串。正如我所说,我们并没有真正保护它,但我们使它更难找到和/或更换。
您也可以添加更复杂的逻辑来说明如何组合加密的公钥和密码。这只会增加更多复杂性,但不会给您任何保证您的密钥不会被解密。无论如何,谷歌确认异或加密总比没有好。
Android 4.3 添加了一些更多的安全功能,也可以用于存储公钥。该解决方案需要服务器通信和硬件支持才能真正安全。这些是Key Chain 增强功能和 Android Keystore Provider。