是否可以在Android上以安全的方式存储API密钥? Ich发现了这个帖子:Is there a safe way to manage API keys?。
如果API密钥与build gradle一起存储,是否可以获取它?它应该只能由机器访问?或者Theresa Vetter是谁?
答案 0 :(得分:2)
有许多方法可以保护您的API密钥或密钥:
我建议使用proguard来模糊你的密钥,它很难被破解并且比其他选项更有效
答案 1 :(得分:0)
有几种方法可以让你隐藏它们,Proguard就是其中之一,也是NDK的用法。虽然我更喜欢别的东西:
然后,当你需要发送它时,只需将它再次Xor以获得真正的密钥。 Here是我写的一个小节点脚本的pastebin,它接受一个文件,每行一个键作为参数,哈希一个类名(在代码顶部定义),并输出新创建的键作为java - 样式字节数组。
以下是我用来检索密钥的代码。
public static String getKey(char[] key) {
final String hashedXor = ShaUtil.run(SomeJavaClass.class.getSimpleName())
.toLowerCase(); // Pick your villager
char[] result = new char[key.length];
for (int i = 0; i < key.length; i++)
result[i] += (char)(((int) key[i]) ^ ((int) hashedXor.charAt(i)));
return new String(result);
}
至于ShaUtil
类
public class ShaUtil {
public static String run(String msg) {
Mac sha512_HMAC = null;
String result = null;
String key = "someKey";
try {
byte[] byteKey = key.getBytes("UTF-8");
final String HMAC_SHA256 = "HmacSHA512";
sha512_HMAC = Mac.getInstance(HMAC_SHA256);
SecretKeySpec keySpec = new SecretKeySpec(byteKey, HMAC_SHA256);
sha512_HMAC.init(keySpec);
byte[] mac_data = sha512_HMAC.doFinal(msg.getBytes("UTF-8"));
result = bytesToHex(mac_data);
} catch (Exception e) {
if (BuildConfig.DEBUG) e.printStackTrace();
}
return result;
}
public static String bytesToHex(byte[] bytes) {
final char[] hexArray = "0123456789ABCDEF".toCharArray();
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
}
此代码的灵感来自this文章。