Realm中的加密给出了java.lang.IllegalStateException:用于解密Realm的密钥错误

时间:2015-06-05 17:40:20

标签: android encryption realm

我在Realm中使用Encryption将数据插入数据库。我必须将数据插入到不同的表中,并尝试加密表中的数据。但我得到 java.lang.IllegalStateException:用于解密Realm的密钥错误。

我的代码:

DatabaseHandlerRealm.java

  public class DatabaseHandlerRealm
   {
    private Realm realm;
    byte[] key, GenKey;
    public int id;

    public void AddBusRoute(Context context, int Id, String RouteName, String Remarks)
    {
        if(realm == null) {
            id = 1;
            key = KeyGenerator();
            realm = Realm.getInstance(context, key);
        }
        realm.beginTransaction();
        BusRouteSchema busRouteSchema = realm.createObject(BusRouteSchema.class);
        busRouteSchema.setId(Id);
        busRouteSchema.setRouteName(RouteName);
        busRouteSchema.setRemarks(Remarks);
        realm.commitTransaction();

    }

    public void AddBusRouteLocation(Context context, int Id, String LocationName, String Remarks)
    {
        if(realm == null)
        {
            id = 2;
            key = KeyGenerator();
            realm = Realm.getInstance(context, key);
        }
        realm.beginTransaction();
        BusRouteLocationSchema busRouteLocationSchema =  realm.createObject(BusRouteLocationSchema.class);
        busRouteLocationSchema.setId(Id);
        busRouteLocationSchema.setLocationName(LocationName);
        busRouteLocationSchema.setRemarks(Remarks);
        realm.commitTransaction();
    }

    public byte[] KeyGenerator()
    {
        if(GenKey == null) {
            GenKey = new byte[64];
            new SecureRandom().nextBytes(GenKey);
        }
        else {
            GenKey = new byte[64];
            new SecureRandom().nextBytes(GenKey);
        }
        return GenKey;
    }
}

MyActivity.java

//to insert data into database
DatabaseHandlerRealm databaseHandlerRealm = new DatabaseHandlerRealm();
            for (BusRoute busRoute : MainActivity.this.busRoutes) {
                databaseHandlerRealm.AddBusRoute(getApplication(),busRoute.getId(),busRoute.getRouteName(),busRoute.getRemarks());
            }

//called from seperate functions.
DatabaseHandlerRealm databaseHandlerRealm = new DatabaseHandlerRealm();
            for (BusRouteLocation busRouteLocation : MainActivity.this.busRouteLocations) {
                databaseHandlerRealm.AddBusRouteLocation(getApplication(), busRouteLocation.Id, busRouteLocation.LocationName, busRouteLocation.Remarks);
            }

日志:

06-05 17:04:48.991  10326-10326/com.myapp.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalStateException: Wrong key used to decrypt Realm.
        at io.realm.Realm.createAndValidate(Realm.java:490)
        at io.realm.Realm.create(Realm.java:471)
        at io.realm.Realm.getInstance(Realm.java:389)
        at io.realm.Realm.getInstance(Realm.java:370)
        at com.myapp.app.DatabaseHandlerRealm.AddBusRouteLocation(DatabaseHandlerRealm.java:42)
        at com.cdass.pokharabus.MainActivity$2.run(MainActivity.java:232)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)

我应该为两者使用不同的加密密钥,还是可以在每次交易时重复使用相同的加密密钥?

1 个答案:

答案 0 :(得分:2)

加密密钥用于加密/解密实际文件。所以它必须在所有交易中都是相同的。这也是为什么你需要找到一种在应用程序重启之间保存密钥的方法,否则你无法再次访问Realm。我们的加密示例中有一些关于如何解决这个问题的链接:https://github.com/realm/realm-java/blob/master/examples/encryptionExample/src/main/java/io/realm/examples/encryptionexample/EncryptionExampleActivity.java#L40-Lundefined