在我的Android应用程序中,我希望加密一行文本,并具有解密功能。
我没有使用javax.crypto
的经验,但我找到了这个答案Encrypt Password in Configuration Files?并实施了类似的内容。
代码:
public String encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException {
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, ITERATIONS));
return Base64.encodeToString(pbeCipher.doFinal(property.getBytes("UTF-8")), Base64.DEFAULT);
}
public String decrypt(String property) throws GeneralSecurityException, IOException {
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, ITERATIONS));
return new String(pbeCipher.doFinal(Base64.decode(property, Base64.DEFAULT)), "UTF-8");
}
我测试了它并且工作正常。但有一件事困扰我,这些方法可以抛出GeneralSecurityException
,UnsupportedEncodingException
和IOException
。
问题:文本成功加密可能会出现这种情况,但在某些情况下(带有新VM的新Android版本或类似情况)decrypt
方法将抛出GeneralSecurityException
或{{1}和app将无法解密该文本?
答案 0 :(得分:3)
至于例外:不应该突然输入正确的输入。 NoSuchAlgorithmException
- 当不再支持该算法时,应该抛出GeneralSecurityException
的子类。
任何API - 或者在这种情况下为加密服务 - 都可以撤销。但这适用于任何功能,因此在这种情况下,您的解决方案空间将为空。在这种情况下,至少算法定义良好,因此您始终可以从开源或类似的东西重新导入代码。当然,这样一个旧的算法可能因为它不再被使用而被撤销,但一般来说Java和Android都是为了向后兼容而不是删除已弃用的函数。
是的,算法稳定但我想你需要删除" b"从 stable 一词中获得更好的理解。
DES不再用于任何安全敏感材料。只有3键DES EDE 仍可用于提供接近安全性的任何内容。
同样适用于PBE算法中使用的PBKDF1。
你需要在GCM模式下使用另一种密码,例如AES,以及更现代的密码散列,如PBKDF2,甚至更好的东西,如Argon2。
你的SALT
常量 - 我认为它是全大写名称的常量 - 应该是动态生成的。使用恒定的盐会破坏目的。
但基本上你需要在利用它之前将密码学理解到某种程度。但是你需要咨询某人,因为复制/粘贴安全性并不存在。
答案 1 :(得分:0)
它可以很容易地解密,因为它将使用DES(CBC)操作模式。 DES仅具有56位的有效密钥大小。因此,无论(PBKDF1)密钥派生如何,密钥和密钥都可以强制执行。
MD5虽然在PBKDF1中使用时虽然被认为是破坏的,但它不是一个问题 - 只要密码当然包含足够的熵。如果可能,您应该使用PBKDF2和AES升级到基于密码的加密(PBE)。请注意,PBE通常使用CBC模式加密,因此不适合传输协议。
这是一项完整的任务,您只需导入并使用它......
"geth --datadir=./foldername/"