Android - การจัดเก็บคีย์ส่วนตัวในที่เก็บคีย์

ฉันจะจัดเก็บคีย์ส่วนตัวของฉัน (รหัสผ่าน, ชื่อผู้ใช้, Sha1) ไว้ใน Keystore เพื่อให้ปลอดภัยได้อย่างไร ฉันลองใช้โค้ดด้านล่างแล้ว แต่ก็ไม่มีโชค

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

นี่คือบันทึกข้อผิดพลาดที่ฉันได้รับ

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 แหล่งที่มา
comment
หากคุณต้องการคอนสตรัคเตอร์ปัจจุบันของคุณจริงๆ (อันที่มีพารามิเตอร์บริบท) ให้ระบุคอนสตรัคเตอร์อื่น (อันว่าง) ที่ไม่มีพารามิเตอร์ .. และดูว่ามันจะไปอย่างไร ..   -  person Yohanes Khosiawan 许先汉    schedule 13.06.2014
comment
คุณช่วยอัปเดตคำตอบของคุณกับสถานการณ์ที่คุณอยู่หลังจากแก้ไขข้อยกเว้นได้ไหม ขณะนี้ข้อยกเว้นและคำถามไม่ตรงกัน   -  person Maarten Bodewes    schedule 13.06.2014
comment
ใช่แล้ว นั่นเป็นข้อยกเว้นที่แตกต่างออกไปที่ฉันกำลังเผชิญอยู่   -  person Shani Goriwal    schedule 13.06.2014


คำตอบ (1)


ปัญหาที่คุณกำลังเผชิญมีรายละเอียดอยู่ในการติดตามข้อยกเว้น:

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

พูดง่ายๆ ก็คือ คุณไม่สามารถทำสิ่งนี้ได้:

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

คุณไม่จำเป็นต้องส่ง Context ผ่านไปยัง Activity เนื่องจากมีอยู่แล้ว (โทร getContext() หรือใช้ this) ในขณะที่เป็นเรื่องปกติที่จะมีตัวสร้างใน Java แต่ Android จะข้ามความต้องการนี้ใน Activities, Services ฯลฯ โดยให้ความสำคัญกับวงจรชีวิตของกิจกรรม

ดูบริบทใน Android คืออะไร และ คู่มือนักพัฒนากิจกรรม Android

person biddulph.r    schedule 13.06.2014
comment
ใช่ ฉันได้รับการแก้ไขแล้ว แต่ฉันต้องการเก็บกุญแจไว้ ความช่วยเหลือใดๆ ??/ - person Shani Goriwal; 13.06.2014
comment
แหล่งข้อมูลบางส่วนที่ฉันพบ: วิธีใช้ที่เก็บคีย์ใน java และ การเข้ารหัส Java โดย Oracle - person biddulph.r; 13.06.2014