5

カスタム暗号で作成した文字列があります。この文字列には、任意のchar値(0〜0xFFFF)を指定できます。この文字列は、入力平文を取得し、各文字を疑似乱数値で回転させることによって作成されるため、出力文字が何であるかを制御することはできません。

これを問題なくSQLiteDatabaseTEXTフィールドに安全に保存および取得できますか?

JavaはUTF-16を使用していると思うので、文字列のランダムな場所に、、、、、などの文字が表示されるのではないかと心配しています。SQLiteがこれを内部でどのように格納するかはよくわかりませんNULL。テキストベースのマーカーを使用してフィールドの開始と終了を決定する場合、これは失敗するのではないかと思います。END OF TEXTESCAPE'"0xfeff / 0xfffe (BOM)

理想的には、入力したのとまったく同じ文字シーケンスを元に戻して、逆暗号化を実行できるようにします。

のマネージドinsert(ContentValues)メソッドを使用するSqLiteDatabaseので、入力文字列のエスケープに関する問題はこれで解決できると思いますが、これが機能するかどうかはまだよくわかりません。

これは安全な操作ですか?そうでない場合は、暗号化された文字列を保存する代わりに他に何をすべきですか?

4

4 に答える 4

2

問題を引き起こす暗号的に弱いカスタム暗号を避け、代わりに、暗号的に強い文字列を提供できるJavaの組み込み機能を使用してください。

http://docs.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#CipherClass

于 2012-10-18T19:37:47.053 に答える
1

文字列をデータベースに入れる簡単で安全な方法は、それが常に機能するかどうかわからないので、私が頭に浮かぶと思うのは、バイト配列を取得することです。

void put(String key、byte [] value)

byte [] getAsByteArray(String key)

本当に文字列として保存する必要がある場合は(しかし、なぜですか?)、base64文字列に変換してデコードし直すことができます。

そうは言っても、insert関数の場合、ContentValuesを使用するとエスケープが実行されるため、これらのいずれも実行する必要はありません。

ContentValueはParcelを使用してタイプを変更します

于 2012-10-18T19:33:27.897 に答える
1

それを「ブロブ」として保存するのが最も安全です。文字列とほとんど同じですが、長さが個別に指定されているだけです。

C文字列は通常nullで終了すると見なされます。

于 2012-10-18T19:35:55.243 に答える
1

SQLiteでは、文字列に文字列の終わりのマーカー、つまり値がゼロの文字を含めることはできません。

ただし、バイナリデータをblobとして保存できます。これは次のようになります。

SQLiteDatabase db = ...;
byte[] binaryData = ...;
ContentValues values = new ContentValues();
values.put("mycolumn", binaryData);
db.insert("mytable", null, values);

Cursor cursor = db.query("mytable", new String[]{"mycolumn"}, ...);
byte[] data = cursor.getBlob(0);
于 2012-10-18T19:45:09.317 に答える