0

java.security.KeyPairが共有設定に保存して読み取るための一種のシリアライゼーションを探しています。.toString() の格納は、KeyPair のコンストラクターがないため、非常に罪深いものになりました。

提案?

4

2 に答える 2

0

私は実際にこの方法で解決しました:

最初に Base64 を使用して文字列を作成し、これを保存してから共有設定から再作成します。

    SharedPreferences prefs = this.getSharedPreferences(
                PATH, Context.MODE_PRIVATE);
    String key = prefs.getString(KEYPATH, "");

    if (key.equals("")) {
        // generate KeyPair
        KeyPair kp = Encrypter.generateKeyPair();
        ByteArrayOutputStream b = new ByteArrayOutputStream();
        ObjectOutputStream o;
        try {
            o = new ObjectOutputStream(b);
            o.writeObject(kp);
        } catch (IOException e) {
            e.printStackTrace();
        }

        byte[] res = b.toByteArray();
        String encodedKey = Base64.encodeToString(res, Base64.DEFAULT);

        prefs.edit().putString(KEYPATH, encodedKey).commit();

    } else {
        // read the KeyPair from internal storage
        byte[] res = Base64.decode(key, Base64.DEFAULT);
        ByteArrayInputStream bi = new ByteArrayInputStream(res);
        ObjectInputStream oi;
        try {
            oi = new ObjectInputStream(bi);
            Object obj = oi.readObject();
            Encrypter.setMyKeyPair((KeyPair) obj);
            Log.w(TAG, ((KeyPair) obj).toString());
        } catch (StreamCorruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
于 2013-01-10T20:07:10.713 に答える
0

残念ながら、Serializable オブジェクトを SharedPreferences に格納する方法はありません。プライベート ファイルとして保存することを検討することをお勧めします。詳細については、Android Storage OptionsFileOutputStream、およびObjectOutputStreamを参照してください。

public static void write(Context context, Object obj, String filename) {
    ObjectOutputStream oos = null;

    try {
        FileOutputStream file = context.openFileOutput(filename, Activity.MODE_PRIVATE);
        oos = new ObjectOutputStream(file);
        oos.writeObject(obj);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (oos != null) {
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public static Object read(Context context, String filename) {
    ObjectInputStream ois = null;
    Object obj = null;

    try {
        FileInputStream file = context.getApplicationContext().openFileInput(filename);
        ois = new ObjectInputStream(file);
        obj = ois.readObject();
    } catch (FileNotFoundException e) {
       // Just let it return null.
       e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (ois != null) {
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return obj;
}
于 2013-01-10T19:47:47.760 に答える