Cipher“PBEWithMD5AndDES”“稳定”吗?

时间:2017-04-16 11:54:35

标签: java android encryption

在我的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");
}

我测试了它并且工作正常。但有一件事困扰我,这些方法可以抛出GeneralSecurityExceptionUnsupportedEncodingExceptionIOException

问题:文本成功加密可能会出现这种情况,但在某些情况下(带有新VM的新Android版本或类似情况)decrypt方法将抛出GeneralSecurityException或{{1}和app将无法解密该文本?

2 个答案:

答案 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/"