Java android 4.0之前的旧版本如何存储密码、accesstoken securly等数据?
我正在构建一个android应用程序,需要在android设备上存储安全数据,该设备也支持4.0之前的旧版本android。我知道android 4.0及其后的版本支持密钥链,但我的应用程序需要支持旧版本。Java android 4.0之前的旧版本如何存储密码、accesstoken securly等数据?,java,android,security,mobile,android-keystore,Java,Android,Security,Mobile,Android Keystore,我正在构建一个android应用程序,需要在android设备上存储安全数据,该设备也支持4.0之前的旧版本android。我知道android 4.0及其后的版本支持密钥链,但我的应用程序需要支持旧版本。 因此,任何人都可以提供帮助并让我知道旧版Android操作系统中使用的方法。在ICS之前的Android版本中,您可以使用密钥库,下面是一个存储到密钥库的示例: public boolean setEntry(String alias, String secretKey) { bo
因此,任何人都可以提供帮助并让我知道旧版Android操作系统中使用的方法。在ICS之前的Android版本中,您可以使用
密钥库
,下面是一个存储到密钥库
的示例:
public boolean setEntry(String alias, String secretKey) {
boolean keyStoreEntryWritten = false;
if (mKeystore != null && secretKey != null) {
// store something in the key store
SecretKeySpec sks = new SecretKeySpec(secretKey.getBytes(), "MD5");
KeyStore.SecretKeyEntry ske = new KeyStore.SecretKeyEntry(sks);
KeyStore.ProtectionParameter pp = new KeyStore.PasswordProtection(null);
try {
mKeystore.setEntry(alias, ske, pp);
// save key store
boolean success = saveKeyStore();
if (success) {
keyStoreEntryWritten = true;
}
} catch (KeyStoreException ex) {
Log.e(TAG, "Failed to read keystore" + mKeyStoreName);
}
}
return keyStoreEntryWritten;
}
private boolean saveKeyStore() {
FileOutputStream fos = null;
boolean keyStoreSaved = true;
// generate key store path
String keyStoreFilePath = generateKeyStoreFilePath(mKeyStoreName, mKeystoreDirectoryPath);
try {
fos = new FileOutputStream(keyStoreFilePath);
mKeystore.store(fos, mKeyStorePassword.toCharArray());
} catch (Exception ex) {
keyStoreSaved = false;
Log.e(TAG, "Failed to save keystore " + mKeyStoreName);
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException ex) {
keyStoreSaved = false;
Log.e(TAG, "Failed to close FileOutputStream");
}
}
}
return keyStoreSaved;
}
您可以在此处找到更多信息:
编辑:
以下是检索密钥的方法:public String getEntry(String alias) {
String secretStr = null;
byte[] secret = null;
if (mKeystore != null) {
try {
if (!mKeystore.containsAlias(alias)) {
Log.w(TAG, new StringBuilder().append("Keystore ").append(mKeyStoreName)
.append(" does not contain entry ").append(alias).toString());
return null;
}
} catch (KeyStoreException ex) {
Log.e(TAG, "Failed to read keystore entry " + alias);
}
// get my entry from the key store
KeyStore.ProtectionParameter pp = new KeyStore.PasswordProtection(null);
KeyStore.SecretKeyEntry ske = null;
try {
ske = (KeyStore.SecretKeyEntry) mKeystore.getEntry(alias, pp);
} catch (Exception ex) {
Log.e(TAG, "Failed to read keystore entry " + alias);
}
if (ske != null) {
SecretKeySpec sks = (SecretKeySpec) ske.getSecretKey();
secret = sks.getEncoded();
if (secret != null) {
secretStr = new String(secret);
} else {
Log.e(TAG, new StringBuilder().append("Read empty keystore entry ").append(alias).toString());
}
} else {
Log.e(TAG, "Failed to read keystore entry " + alias);
}
}
return secretStr;
}
谢谢你,伊内斯特尔。它真的很有用,但现在我关心的是我必须将secretKey存储在某个正确的地方,因此再次出现了如何安全地存储它的问题?如果我错了,请纠正我。我添加了一个取回钥匙的示例-希望此帮助再次感谢inistel。看了代码之后,我仍然担心mKeyStorePassword。这是安全的吗?我的意思是,据我所知,它可以访问,但没有安全性,对吗?如果我错了,请纠正我。您可以在代码(硬编码)中设置密码,使其无法访问,或者,您可以通过任何其他方式对其进行加密和存储。密钥库将帮助您保存动态的安全数据。“您可以在代码中设置密码(硬编码)以使其无法访问…”-在程序中硬编码密码违反了许多安全编码惯例。有关详细信息,请参阅和。