我可以安全地将完全随机的字符串(任何16位值)存储到SQLite DB中吗?

时间:2012-10-18 19:30:30

标签: java android sqlite android-sqlite

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

我是否可以安全地存储和检索这个而没有任何问题进入SQLiteDatabase TEXT字段?

我认为Java使用UTF-16,所以我有点害怕像NULLEND OF TEXTESCAPE',{{1 }},"等出现在我的字符串中的随机位置,我不确定SQLite将如何在内部存储它。如果它使用任何基于文本的标记来确定字段的开始和结束,我担心这会失败。

理想情况下,我想要退回我输入的完全相同的字符序列,以便我可以通过反向密码。

我将使用0xfeff / 0xfffe (BOM)的托管insert(ContentValues)方法,因此我认为这会解决有关转义输入字符串的任何问题,但我仍然不相信这可以工作

这是一个安全的操作,如果没有,我还应该做些什么来存储我的加密字符串?

4 个答案:

答案 0 :(得分:2)

避免使用Cryptographically弱的自定义密码也会导致问题,而是使用Java内置的功能,它可以为您提供加密强大的字符串。

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

答案 1 :(得分:1)

将String放入数据库的一种简单而安全的方法,你不确定它是否总能正常工作,我能想到的是获取字节数组:

void put(String key,byte [] value)

byte [] getAsByteArray(String key)

如果你真的需要将它存储为String(但为什么?),你可以将它转换为base64字符串并将其重新解码。

话虽如此,你不应该做任何这些,因为对于insert函数,如果你使用ContentValues,它应该为你做转义。

ContentValue使用Parcel进行类型更改

答案 2 :(得分:1)

将它存储为“blob”是最安全的 - 与字符串完全相同,只有单独指定的长度。

通常假定C字符串以空值终止。

答案 3 :(得分: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);