android - 使用 Android 进行 Realm 加密

标签 android encryption react-native realm

Realm 使用 AES-256 进行加密和解密。而且,我正在尝试使用 Android KeyStore 来生成/存储 key ,但根据此页面 - https://developer.android.com/training/articles/keystore.html#SecurityFeatures , Android 仅在 API 23 及更高版本上支持此功能。

有人可以指出我如何使用带加密的 Realm 来支持 API 4.0 及更高版本的示例或任何其他相关信息吗?

谢谢。

最佳答案

我们最近遇到了同样的问题,决定简单地将 key 存储在私有(private) Shared Preferences 中,因为如果手机没有 root,你将无法获取它,如果它已 root,那么甚至有一些方法可以获取数据来自安全 keystore 。

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

RealmConfiguration config = new RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .name(DB_NAME)
            .encryptionKey(mKeyProvider.getRealmKey())
            .build();

mKeyProvider 是我们用来获取 key 的辅助类:
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();
}

关于android - 使用 Android 进行 Realm 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38079850/

相关文章:

java - 关于 Android API 中的新方法和弃用方法

reactjs - 如何增加 react-native Slider 组件的高度?

c# - Azure 网站上的数据保护/加密?

java - 模数未返回非负输入的正确值

ios - 当我从 XCode 运行应用程序时,React Native : Can't see console. 记录

react-native - 当 SectionList 组件中的部分为空时渲染 'no content' 组件

android - 如何在Android上销毁golang子进程?

android - 自定义 NumberPickerPreference - 如何设置 NumberPicker 值?

android - 如何检测屏幕脚轮android,检测水龙头压力

c# - 如何生成不寻常但数学上有效的 RSA key ?