PaladiN
PaladiN

Reputation: 4944

Encryption in Realm gives java.lang.IllegalStateException: Wrong key used to decrypt Realm

I am using Encryption in Realm for inserting data into database. I have to insert data into different tables, and tried to encrypt the data in tables. But i just got java.lang.IllegalStateException: Wrong key used to decrypt Realm.

My Codes:

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);
            }

Log:

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)

Should i use different encryption key for both or can reuse the same encryption key on every transactions?

Upvotes: 0

Views: 1380

Answers (1)

Christian Melchior
Christian Melchior

Reputation: 20126

The encryption key is used to encrypt/decrypt the actual file. So it has to be same across all transactions. That is also why you need to find a way to save the key between app restarts as otherwise you cannot access the Realm again. There are some links in our encryption example on how to go about this: https://github.com/realm/realm-java/blob/master/examples/encryptionExample/src/main/java/io/realm/examples/encryptionexample/EncryptionExampleActivity.java#L40-Lundefined

Upvotes: 2

Related Questions