我有一个用自定义密码创建的字符串,它可以有任何char
值(0到0xFFFF)。这个字符串是通过输入明文并用伪随机值旋转每个字符来创建的,所以我无法控制输出字符可能是什么。
我是否可以安全地存储和检索这个而没有任何问题进入SQLiteDatabase TEXT
字段?
我认为Java使用UTF-16,所以我有点害怕像NULL
,END OF TEXT
,ESCAPE
,'
,{{1 }},"
等出现在我的字符串中的随机位置,我不确定SQLite将如何在内部存储它。如果它使用任何基于文本的标记来确定字段的开始和结束,我担心这会失败。
理想情况下,我想要退回我输入的完全相同的字符序列,以便我可以通过反向密码。
我将使用0xfeff / 0xfffe (BOM)
的托管insert(ContentValues)
方法,因此我认为这会解决有关转义输入字符串的任何问题,但我仍然不相信这可以工作
这是一个安全的操作,如果没有,我还应该做些什么来存储我的加密字符串?
答案 0 :(得分:2)
避免使用Cryptographically弱的自定义密码也会导致问题,而是使用Java内置的功能,它可以为您提供加密强大的字符串。
http://docs.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#CipherClass
答案 1 :(得分:1)
将String放入数据库的一种简单而安全的方法,你不确定它是否总能正常工作,我能想到的是获取字节数组:
如果你真的需要将它存储为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);