Android的领域加密

use*_*421 2 encryption android realm react-native

Realm使用AES-256进行加密和解密。而且,我正在尝试使用Android KeyStore生成/存储密钥,但是按照此页面-https://developer.android.com/training/articles/keystore.html#SecurityFeatures,Android仅在API 23和以上。

有人可以给我指出一个示例或其他有关如何使用加密领域来支持API 4.0及更高版本的信息吗?

谢谢。

Gak*_*ket 6

我们最近遇到了同样的问题,并决定将密钥仅存储在私有的“共享首选项”中,因为如果手机没有植根,您将无法获得它,并且如果植根了手机,那么还有一些方法甚至可以获取数据来自安全的keyStore。

我们在Application子类中使用下一个Realm配置:

RealmConfiguration config = new RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .name(DB_NAME)
            .encryptionKey(mKeyProvider.getRealmKey())
            .build();
Run Code Online (Sandbox Code Playgroud)

mKeyProvider是我们的帮助器类,用于获取密钥:

public class SharedPrefsKeyProvider implements KeyProvider {

private static final String REALM_KEY = "chats.realm_key";
SharedPreferences mAppSharedPrefs;


public SharedPrefsKeyProvider(SharedPreferences aAppSharedPrefs) {
    mAppSharedPrefs = aAppSharedPrefs;
}

@Override
public byte[] getRealmKey() {
    byte[] key;
    String savedKey = getStringFromPrefs(REALM_KEY);
    if (savedKey.isEmpty()) {
        key = generateKey();
        String keyString = encodeToString(key);
        saveStringToPrefs(keyString);
    } else {
        key = decodeFromString(savedKey);
    }
    return key;
}

@Override
public void removeRealmKey() {
    mAppSharedPrefs.edit().remove(REALM_KEY).apply();
}

@NonNull
private String getStringFromPrefs(String aKey) {
    return mAppSharedPrefs.getString(aKey, "");
}

private void saveStringToPrefs(String aKeyString) {
    mAppSharedPrefs.edit().putString(REALM_KEY, aKeyString).apply();
}

private String encodeToString(byte[] aKey) {
    Timber.d("Encoding Key: %s", Arrays.toString(aKey));
    return Base64.encodeToString(aKey, Base64.DEFAULT);
}

private byte[] decodeFromString(String aSavedKey) {
    byte[] decoded = Base64.decode(aSavedKey, Base64.DEFAULT);
    Timber.d("Decoded Key: %s", Arrays.toString(decoded));
    return decoded;
}

private byte[] generateKey() {
    byte[] key = new byte[64];
    new SecureRandom().nextBytes(key);
    return key;
}
}
Run Code Online (Sandbox Code Playgroud)

A KeyProvider只是一个自定义界面。的一个示例KeyProvider可以是:

package xxx.com;

interface KeyProvider {
    byte[] getRealmKey();

    void removeRealmKey();
}
Run Code Online (Sandbox Code Playgroud)