我正在学习Java加密算法,偶然发现了该算法:
SecretKey key = SecretKeyFactory.getInstance(
"PBEWithMD5AndDES").generateSecret(keySpec);
我知道它代表使用MD5和DES算法的基于密码的加密。 我知道MD5和DES是两个单独的算法加密密钥,但是PBEWithMD5AndDes作为算法到底意味着什么?
在线上没有太多资源可以很好地解释这种“算法”。
我希望有人能给出一个简单而简短的解释,说明它与普通的MD5或普通的DES算法有何不同。
答案 0 :(得分:3)
扩展上一个答案
PBEWithMD5AndDes作为算法到底意味着什么?
PBE正在使用由密码,随机盐和迭代次数生成的加密密钥,请参阅KeySpec参数。
KeySpec pbeSpec = new PBEKeySpec(password.toCharArray(), psswdSalt, PBKDF_INTERATIONS, SYMMETRIC_KEY_LENGTH)
想法是-密码往往很短且不够随机,因此很容易猜到。使用迭代次数应该会使猜测更加困难。
PBEWithMD5AndDes
使用MD5和DES生成密钥,请参见example code。现实生活中的实现应该使用更多的迭代次数
仅使用MD5或仅使用DES有何区别?这就是我想知道的。
理论上-您可以使用纯MD5或DES,但是今天的计算机可以非常快速地猜测密码。
请注意,DES和MD5今天已过时。在商用硬件上不到一分钟的时间就可以发现MD5冲突,而DES正在使用64位密钥,这在当今看来已经很安全了。
答案 1 :(得分:2)
PBE代表“基于密码的加密”,一种从密码(文本)派生加密密钥(二进制数据)的方法。
答案 2 :(得分:0)
PBEWithMD5AndDES是https://docs.oracle.com/javase/9/docs/specs/security/standard-names.html#cipher-algorithm-names中描述的算法。该算法是PKCS#5(https://tools.ietf.org/html/rfc2898#section-6.1.1)中描述的算法。
基本上,第一步是算法将密码转换为密钥。这称为密钥派生,并将MD5用作“加扰”功能。输出提供了适用于CBC模式下的DES的IV和密钥,这些密钥和密钥在第二步中用于加密。
该算法不再安全,主要是因为DES仅使用56位密钥,这对于现代攻击(例如https://crack.sh/)而言太短了。即使MD5容易发生冲突,这里实际上也不是问题(冲突只会为给定的密钥提供替代密码,但不会传达密钥)。