2017-05-24 5 views
-3

私はのEditText eを持っていると私は、私はちょうどストアとSQLiteのAndroidの中で暗号化された値を取得

byte[] encoded = encodeData(key, e.getText.toString()); 
として、このメソッドを呼んでいるこの方法

byte[] encodeData(byte[] key, byte[] data) 
{ 
    try { 
     SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
     Cipher cipher = Cipher.getInstance("AES"); 
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

     return cipher.doFinal(data); 
    } catch(Exception e) { 
     Log.e("Cryptography", e.getMessage()); 
    } 
    return new byte[0]; 
} 

を使用して、そのコンテンツの価値を暗号化しています

そして

SQLiteDatabase sd = db.getWritableDatabase(); 
ContentValues cv = new ContentValues(); 
cv.put("COL_NAME", encoded); 

としてSQLiteDatabseに値を格納し、それを私たちを取得します機能

byte[] decodeData(byte[] key, byte[] data) 
{ 
    try { 
     SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
     Cipher cipher = Cipher.getInstance("AES"); 
     cipher.init(Cipher.DECRYPT_MODE, skeySpec); 

     return cipher.doFinal(data); 
    } catch(Exception e) { 
     Log.e("Cryptography", e.getMessage()); 
    } 
    return new byte[0]; 
} 

下にすると

SQLiteDatabase sd = db.getReadableDatabase(); 
Cursor cur = sd.rawQuery("select * from TABLE_NAME", null); 
if(cur.moveToNext()) { 
    byte[] decoded = decodeData(key, cur.getBlob(0)); 
} 

しかし、私は、それが空白表示され、この値としてのEditTextの値を設定していて、それを呼び出します。

e.setText(new String(decoded)); 

暗号化せずにデータを保存しても、正常に動作します。

+0

あなたは 'e.setText(新しいString(新しいバイト[0]))やっているように、今それはそうbecuaseログを読んで、' ...また 'cur.getBlob(0)'あなたは確信していますBLOB列は最初の列ですか? – Selvin

+0

ohhはい....私はdecodeDataメソッドで例外を受けています。最後のブロックが復号化に不完全であると言っています –

答えて

-1

私は間違った方法でカーソルを処理していると思います。

if (c.moveToFirst()) { 
    while(!c.isAfterLast()) { // If you use c.moveToNext() here, you will bypass the first row, which is WRONG 
    ... 
    c.moveToNext(); 
    } 
} 
+0

rawQueryは最初の状態の前にカーソルを返します... wanaだけしか得られない場合にはmoveToNext最初の行 – Selvin

関連する問題