如何在Android中的应用程序中安全地存储私钥?

时间:2017-12-06 05:23:32

标签: android cryptography

我想在我的应用程序中安全地存储私钥。我读了很多SO问题,但未找到合适的答案?

Sharedpreference是安全存储的方式,但root手机可以轻松找到它。

任何人都可以告诉我如何在Android应用中安全地存储key = "The real world"吗?

由于

3 个答案:

答案 0 :(得分:0)

有关安全性的字符串,请参阅密钥链部分。 here

github repo中的Google Keychain示例。 Keychain

答案 1 :(得分:0)

对称加密示例 - AES 这是一种非常流行且高效的对称算法 - 高级加密标准(AES)。 AES基于两位比利时密码学家开发的Rijndael密码,已被美国政府采用,目前已在全球范围内使用。

用作:

初​​始化

    private SecretKeySpec secrateKeyInit() {
    SecretKeySpec sks = null;
    try {
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        sr.setSeed("any data used as random seed".getBytes());
        KeyGenerator kg = KeyGenerator.getInstance("AES");
        kg.init(128, sr);
        sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES");
    } catch (Exception e) {
        Log.e(TAG, "AES secret key spec error");
    }
    return sks;
}

// for incode data

private byte[] IncodeData(SecretKeySpec sks, String simplestring) {
    // Encode the original data with AES
    byte[] encodedBytes = null;
    try {
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.ENCRYPT_MODE, sks);
        encodedBytes = c.doFinal(simplestring.getBytes());//store this any were
    } catch (Exception e) {
        Log.e(TAG, "AES encryption error");
    }
    return encodedBytes;
}

用于解码数据:

    private String Decrypt(SecretKeySpec sks, byte[] incodeddata) {
    String value = null;
    // Decode the encoded data with AES
    byte[] decodedBytes = null;
    try {
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.DECRYPT_MODE, sks);
        decodedBytes = c.doFinal(incodeddata);
        value = new String(decodedBytes);
    } catch (Exception e) {
        Log.e(TAG, "AES decryption error");
    }
    return value;
}

保存这个你想要的并使用

如果您使用静态字符串

使用C ++将你的字符串存储在app中,如

  extern "C"
    jstring
    Java_com_shrinkcom_trackvees_utils_AppController_getLogin(JNIEnv *env, jobject instance) {

        std::string hello = "hello";
        return env->NewStringUTF(hello.c_str());
    }

通过致电public native String stringnameincfile来使用它 它返回你好的单词,但当你解密你的apk或任何有根的手机时它没有看到

答案 2 :(得分:0)

您可以通过加密将其安全地存储在共享首选项中。然后使用KeyStore来保护密钥以进行解密。

没有办法在Android上100%保护数据,但是你可以让黑客更难获得它。 (比如加密)。

KeyStore:https://www.androidauthority.com/use-android-keystore-store-passwords-sensitive-information-623779/