gpt4 book ai didi

java - 如何使用 Android KeyStore 生成、保存和加载对称 key

转载 作者:行者123 更新时间:2023-11-30 00:03:32 25 4
gpt4 key购买 nike

我目前正在从事一个我们想要加密但不能使用服务器(我们不允许)的项目。我现在正在用这行代码制作我的 key :

key = KeyGenerator.getInstance("AES").generateKey();

所有的加密和解密都与之完美配合。问题是,每次您终止该应用程序并再次运行它时,都没有任何效果,因为会创建一个新 key 。所有以前加密的数据都不能再用这个新 key 解密。

我需要制作每次打开我的应用程序时获取相同 key 的函数。这就是为什么我要使用 keystore (我不允许将 key 存储在设备上,我只能使用 Android keystore 或 RAM)。

知道如何准确地做到这一点吗?我在网上找到的唯一链接是配对 key 。

最佳答案

终于成功了!使用此链接,我制作了一个无法正常工作的基本代码,但在其他堆栈溢出帖子的帮助下,我成功了。

这是为可能需要它的任何其他人提供的解决方案:

这应该在您的 MainActivity java 类中。

public KeyStore ks;

@Override protected void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

try{
// Get Keystore
ks = KeyStore.getInstance(KeyStore.getDefaultType());

SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this);
boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
if (isFirstRun)
{
SharedPreferences.Editor editor = wmbPreference.edit();
editor.putBoolean("FIRSTRUN", false);
editor.commit();

ks.load(null, password);
GenerateKey();
} else {
LoadKey();
}
}
catch(Exception ex){
ex.printStackTrace();
}

myClassNeedingTheKey.secretKey = key;
}

它声明在您的应用程序首次运行时,它会创建 keystore 和随附的 key (我们也会保存所有内容)。如果这不是您第一次运行该应用程序,请加载 key 。然后在结束 onCreate 之前,我们将 key 传递给需要它的任何人。

这是生成、保存和加载的实际代码。这也在典型的 MainActivity 类中,因为它被您放在 onCreate 中的代码使用。

public SecretKey key;

public char[] password = "1234567890".toCharArray();

void GenerateKey(){
try {
// Get and Convert the Key
key = KeyGenerator.getInstance("AES").generateKey();

SaveKey();
}
catch(Exception ex){
ex.printStackTrace();
}
}

void SaveKey(){
try{
// Save my secret key
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(key);
ks.setEntry("SecretKeyAlias", secretKeyEntry,null);

// Save the keystore
FileOutputStream fos = new FileOutputStream(this.getFilesDir().getAbsolutePath() + "/OEKeyStore");
ks.store(fos, password);
}
catch(Exception ex){
ex.printStackTrace();
}
}

void LoadKey(){
try{
// Load Keystore
FileInputStream fis = new FileInputStream(this.getFilesDir().getAbsolutePath() + "/OEKeyStore");
ks.load(fis, password);

// Load the secret key
KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry)ks.getEntry("SecretKeyAlias",null);
key = secretKeyEntry.getSecretKey();
}
catch(Exception ex){
ex.printStackTrace();
}
}

给你!然后,您可以使用 key 做任何您想做的事情。

关于java - 如何使用 Android KeyStore 生成、保存和加载对称 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49454641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com