5

我有一个使用自定义密码创建的字符串,它可以具有任何char值(0 到 0xFFFF)。该字符串是通过获取输入明文并将每个字符旋转一个伪随机值来创建的,因此我无法控制输出字符可能是什么。

我可以安全地将其存储和检索到 SQLiteDatabaseTEXT字段中而没有任何问题吗?

我认为 Java 使用 UTF-16,所以我有点害怕像NULL, END OF TEXT, ESCAPE, ',"等这样的字符0xfeff / 0xfffe (BOM)会随机出现在我的字符串中,而且我不确定 SQLite 将如何在内部存储它。如果它使用任何基于文本的标记来确定字段的开始和结束,恐怕这会失败。

理想情况下,我想取回我输入的完全相同的字符序列,这样我就可以通过反向密码来输入它。

我将使用 的托管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

将其存储为“blob”是最安全的——与字符串几乎相同,只是具有单独指定的长度。

通常假定 C 字符串以空值结尾。

于 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 回答
1

将 String 放入数据库的一种简单而安全的方法是获取字节数组,您不确定它是否总是有效,我可以想到的是:

无效放(字符串键,字节[]值)

byte[] getAsByteArray(字符串键)

如果您确实需要将其存储为字符串(但为什么?)并将其重新解码,则可以将其转换为 base64 字符串。

话虽如此,您不需要执行任何这些操作,因为对于插入功能,如果您使用 ContentValues,它应该为您进行转义。

ContentValue 使用Parcel进行类型更改

于 2012-10-18T19:33:27.897 回答