【问题标题】:How to generate,save and load a symmetric key using the Android KeyStore如何使用 Android KeyStore 生成、保存和加载对称密钥
【发布时间】:2018-03-23 16:44:53
【问题描述】:

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

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

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

我需要制作一个每次打开我的应用程序时都获取相同密钥的函数。这就是我想使用密钥库的原因(我不允许将密钥存储在设备上,我只能使用 Android 密钥库或 RAM)。

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

【问题讨论】:

  • 您是否尝试使用 Android NDK 保存密钥?
  • 不,我正在网上搜索,我很难找到一个好的例子。你有一个链接,我可以看到它是如何完成的?
  • 有一个链接,我曾经开始,但我不得不做一些改变。但是,如果您的项目中的安全性不是绝对必要的,那么也要考虑其他选项。 medium.com/google-developer-experts/…
  • 我的项目不需要绝对安全,所以我正在寻找一个简单、易于实施的解决方案。
  • 我正在尝试使用此链接:developer.android.com/reference/java/security/KeyStore.html,但我很难理解哪些代码块正在保存我的密钥以及加载它的内容(以及如何知道它是否已保存)。

标签: java android encryption key keystore


【解决方案1】:

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

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

这应该在您的 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;
    }

它声明在您的应用程序第一次运行时,它会创建密钥库和与之配套的密钥(我们还保存所有内容)。如果这不是您第一次运行该应用程序,请加载密钥。然后在结束 onCreate 之前,我们将密钥传递给需要它的人。

这是生成、保存和加载的实际代码。这也在一个典型的 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();
    }
}

你去吧!然后,您可以使用密钥做任何您想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    相关资源
    最近更新 更多