MD5消息摘要算法是一个广泛使用的加密Hash函数,被广泛应用于密码存储、消息和数据的完整性验证。
然而,MD5算法被证明不安全已超过十年了,自从王小云破解MD5算法后,国内外对MD5碰撞的相关研究与恶意利用从未停止,可在网上搜索《MD5碰撞的演化之路》详细了解。
虽然大部分公司已经抛弃了MD5,但是还是有不少公司在使用这种过时的算法。
不安全的代码示例(JAVA)
MessageDigest md5Digest = MessageDigest.getInstance("MD5"); md5Digest.update(password.getBytes()); byte[] hashValue = md5Digest.digest();
byte[] hashValue = DigestUtils.getMd5Digest().digest(password.getBytes());
代码这样写才安全(JAVA)
使用bouncy castle:
public static byte[] getEncryptedPassword(String password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException { PKCS5S2ParametersGenerator gen = new PKCS5S2ParametersGenerator(new SHA256Digest()); gen.init(password.getBytes("UTF-8"), salt.getBytes(), 4096); return ((KeyParameter) gen.generateDerivedParameters(256)).getKey(); }
Java 8 及以上:
public static byte[] getEncryptedPassword(String password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException { KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 4096, 256 * 8); SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); return f.generateSecret(spec).getEncoded(); }
本文暂时没有评论,来添加一个吧(●'◡'●)