Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android 4.0之前的旧版本如何存储密码、accesstoken securly等数据?_Java_Android_Security_Mobile_Android Keystore - Fatal编程技术网

Java android 4.0之前的旧版本如何存储密码、accesstoken securly等数据?

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应用程序,需要在android设备上存储安全数据,该设备也支持4.0之前的旧版本android。我知道android 4.0及其后的版本支持密钥链,但我的应用程序需要支持旧版本。
因此,任何人都可以提供帮助并让我知道旧版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。这是安全的吗?我的意思是,据我所知,它可以访问,但没有安全性,对吗?如果我错了,请纠正我。您可以在代码(硬编码)中设置密码,使其无法访问,或者,您可以通过任何其他方式对其进行加密和存储。密钥库将帮助您保存动态的安全数据。“您可以在代码中设置密码(硬编码)以使其无法访问…”-在程序中硬编码密码违反了许多安全编码惯例。有关详细信息,请参阅和。