解决
显然下面的代码可以工作,但Eclipse有一些问题,我重新启动它来修复它。 (经过所有这些小时的调试......)
我正在为我的应用中的东西编写一个小的加密机制。它没有连接到提供令牌的服务,所以我必须在本地存储一些敏感数据,我想要加密。我认为在SharedPreferences中有一个好地方,我可以存储一些加密的数据,用户必须提供用于解锁数据的“密钥”(它是算法的一部分,因此该部分永远不会是truley存储的)。
问题是我创建了一个加密的数据(作为byte[]
返回给我,我转换为Base64(也尝试过UTF-8),并存储在SharedPreferences中。用于测试目的现在我立即从共享首选项中读回字符串并尝试使用用于加密的相同“密钥”对其进行解密,但是它会抛出一些异常,并且用于存储的字节数组和一个用于检索的字节数组(并转换为字节)是不一样。
我正在使用以下问题的接受答案中给出的加密示例:
我的代码如下:
SharedPreferences crypto = getActivity().getSharedPreferences("cryptodb",
Context.MODE_PRIVATE);
String uuid = createLocalUUID(); //used to prevent moving data to a different device (security risk)
if (uuid != null) {
try {
SecretKey secret = Cryptography.generateKey(passPhrase,
uuid.getBytes("UTF-8")); //This key generator is the same as the one used for decryption below
byte[] encrypted = Cryptography.encryptMsg(uuid, secret);
SharedPreferences.Editor editor = crypto.edit();
String putdata = Base64.encodeBytes(encrypted);
editor.putString("pass_check", putdata); //decrypt this back to the "stored" UUID to show that this is the correct passphrase
// Commit the edits!
editor.commit();
//Test decrypting the validator object
String validation = crypto.getString("pass_check", "FAILURE"); //get string. Must provide fallback string
String result = Cryptography.decryptMsg(Base64.decode(validation), secret); //fails
} catch (Exception e) {
// too many exceptions to catch.
e.printStackTrace();
}
}
我使用的Cryptography类工作,因为它加密和解密if I don't put and get the string from SharedPreferences
。我也尝试将数据存储为UTF-8而不是Base64,但同样的问题仍然存在。
我放置和读回的'字符串'是相同的(我在代码中测试过),但是当我比较字节数组时(使用Arrays.compare()
,它返回它们是不同的。所以我不确定发生了什么...
感谢任何帮助。