我想在我的应用程序中安全地存储私钥。我读了很多SO问题,但未找到合适的答案?
Sharedpreference
是安全存储的方式,但root手机可以轻松找到它。
任何人都可以告诉我如何在Android应用中安全地存储key = "The real world"
吗?
由于
答案 0 :(得分:0)
答案 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/