Android - Menyimpan kunci pribadi di keystore

Bagaimana cara menyimpan kunci pribadi saya (kata sandi, nama pengguna, Sha1) di Keystore sehingga saya dapat mengamankannya? Saya telah mencoba kode di bawah ini tetapi tidak berhasil.

private Context ctx;

public MainActivity(Context ctx) {
    this.ctx = ctx;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    try {
        genKey();
    } catch (Exception e) {

        e.printStackTrace();
        Log.d("warning", "m in catch");
    }

}

public void genKey() throws Exception {
    SecretKey key = KeyGenerator.getInstance("AES").generateKey();

    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(null, "clavedekey".toCharArray());

    PasswordProtection pass = new PasswordProtection(
            "fedsgjk".toCharArray());
    KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(key);
    ks.setEntry("secretKeyAlias", skEntry, pass);

    FileOutputStream fos = ctx.openFileOutput("bs.keystore",
            Context.MODE_PRIVATE);
    ks.store(fos, "clavedekey".toCharArray());
    fos.close();
}

inilah kesalahan log yang saya dapatkan.

06-13 14:04:11.829: E/AndroidRuntime(6248): FATAL EXCEPTION: main
06-13 14:04:11.829: E/AndroidRuntime(6248): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.demo_keystore/com.demo_keystore.MainActivity}: java.lang.InstantiationException: can't instantiate class com.demo_keystore.MainActivity; no empty constructor
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2045)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2146)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.app.ActivityThread.access$700(ActivityThread.java:140)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.os.Looper.loop(Looper.java:177)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.app.ActivityThread.main(ActivityThread.java:4947)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at java.lang.reflect.Method.invoke(Method.java:511)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at dalvik.system.NativeStart.main(Native Method)
06-13 14:04:11.829: E/AndroidRuntime(6248): Caused by: java.lang.InstantiationException: can't instantiate class com.demo_keystore.MainActivity; no empty constructor
06-13 14:04:11.829: E/AndroidRuntime(6248):     at java.lang.Class.newInstanceImpl(Native Method)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at java.lang.Class.newInstance(Class.java:1319)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
06-13 14:04:11.829: E/AndroidRuntime(6248):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2036)
06-13 14:04:11.829: E/AndroidRuntime(6248):     ... 11 more

person Shani Goriwal    schedule 13.06.2014    source sumber
comment
jika Anda benar-benar membutuhkan konstruktor Anda saat ini (yang memiliki parameter konteks), maka tentukan saja konstruktor lain (yang kosong) tanpa parameter.. dan lihat bagaimana kelanjutannya..   -  person Yohanes Khosiawan 许先汉    schedule 13.06.2014
comment
Bisakah Anda memperbarui jawaban Anda dengan situasi Anda saat ini setelah memperbaiki pengecualian? Saat ini pengecualian dan pertanyaannya tidak cocok.   -  person Maarten Bodewes    schedule 13.06.2014
comment
yaa sebenarnya itu adalah pengecualian berbeda yang saya hadapi.   -  person Shani Goriwal    schedule 13.06.2014


Jawaban (1)


Masalah yang Anda hadapi dirinci dalam jejak pengecualian:

Caused by: java.lang.InstantiationException: can't instantiate class 
           com.demo_keystore.MainActivity; no empty constructor

Sederhananya, Anda tidak dapat melakukan ini:

public MainActivity(Context ctx) {
    this.ctx = ctx;
}

Anda tidak perlu meneruskan Context ke Activity, sudah ada (panggil getContext() atau gunakan saja this). Meskipun memiliki konstruktor di Java adalah hal yang umum, Android mengabaikan kebutuhan ini di Activities, Services dll, dan lebih memilih Siklus hidup aktivitas.

Lihat Apa itu Konteks di Android dan Panduan Pengembang Aktivitas Android.

person biddulph.r    schedule 13.06.2014
comment
ya, saya telah mengatasi kerusakan saya tetapi saya ingin menyimpan kunci saya, ada bantuan??/ - person Shani Goriwal; 13.06.2014
comment
Beberapa sumber yang saya temukan: Cara menggunakan keystore di Java dan Kriptografi Java oleh Oracle - person biddulph.r; 13.06.2014