Android领域加密

Android领域加密,android,encryption,react-native,realm,Android,Encryption,React Native,Realm,Realm正在使用AES-256进行加密和解密。而且,我正在尝试使用Android密钥库生成/存储密钥,但根据本页,Android仅在API23及以上版本上支持此功能 有人能给我举个例子或其他相关信息,说明我如何使用realm with encryption来支持API4.0及以上版本吗 谢谢。我们最近遇到了同样的问题,决定将密钥简单地存储在私有共享首选项中,因为如果手机没有根目录,您将无法获取它,如果它是根目录,那么即使从安全密钥库也有一些获取数据的方法 我们在应用程序子类中使用下一个领域配置

Realm正在使用AES-256进行加密和解密。而且,我正在尝试使用Android密钥库生成/存储密钥,但根据本页,Android仅在API23及以上版本上支持此功能

有人能给我举个例子或其他相关信息,说明我如何使用realm with encryption来支持API4.0及以上版本吗


谢谢。

我们最近遇到了同样的问题,决定将密钥简单地存储在私有共享首选项中,因为如果手机没有根目录,您将无法获取它,如果它是根目录,那么即使从安全密钥库也有一些获取数据的方法

我们在
应用程序
子类中使用下一个领域配置:

RealmConfiguration config = new RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .name(DB_NAME)
            .encryptionKey(mKeyProvider.getRealmKey())
            .build();
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;
}
}
KeyProvider
只是一个自定义接口。
KeyProvider
的示例可以是:

package xxx.com;

interface KeyProvider {
    byte[] getRealmKey();

    void removeRealmKey();
}

AES 256加密是对称加密,请尝试非对称的RSA加密。如果您试图加密敏感用户数据以存储在preferences或sqlite中,我建议您尝试Android密钥存储系统

Android密钥库系统允许您将加密密钥存储在容器中,从而使从设备中提取密钥更加困难。一旦密钥位于密钥库中,它们就可以用于加密操作,而密钥材料仍然不可导出

检查我的示例gist以实现此加密和解密


更好的是,它可以在android 18及以上版本上运行。

也许可以帮助您这不是加密域数据库的最佳方式。请添加KeyProvider类定义,@GaketIt已经存在,请查看第二个代码段SharedPrefsKeyProvider。在第二个代码段中,有
公共类SharedPrefsKeyProvider实现了KeyProvider
。但是我不知道什么是
KeyProvider
,也不知道从哪里导入该类。我的猜测是,您在android项目中使用cloudant库,并使用cloudant库提供的
KeyProvider
类。我说得对吗?明白了。不,它只是我们创建的一个接口,用于在其他API级别上使用其他解决方案时使用密钥。您可以提出另一个方案,也可以简单地使用一个实现。我建议将密钥保存到密钥库中,而不是共享首选项,否则您最好不要麻烦用公开可见的密钥加密数据库