在Android上以安全的方式存储API密钥?

时间:2017-06-23 12:13:58

标签: android security gradle key

是否可以在Android上以安全的方式存储API密钥? Ich发现了这个帖子:Is there a safe way to manage API keys?

如果API密钥与build gradle一起存储,是否可以获取它?它应该只能由机器访问?或者Theresa Vetter是谁?

2 个答案:

答案 0 :(得分:2)

有许多方法可以保护您的API密钥或密钥:

  • 使用共享首选项并加密这些共享首选项(不是这样) 好)
  • 将您的密钥嵌入资源文件
  • 将您的密钥隐藏在构建配置
  • 使用proguard
  • 混淆您的密钥

我建议使用proguard来模糊你的密钥,它很难被破解并且比其他选项更有效

答案 1 :(得分:0)

有几种方法可以让你隐藏它们,Proguard就是其中之一,也是NDK的用法。虽然我更喜欢别的东西:

  • 哈希你的一个班级名字(见下文)
  • 使用你的api密钥
  • 将结果存储为Java类中的常量字节数组

然后,当你需要发送它时,只需将它再次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文章。