常见算法及其特点
算法名 | MD5 | SHA-1 | SHA-224 | SHA-256 | SHA-384 | SHA-512 | SHA-3 |
---|---|---|---|---|---|---|---|
输出bit | 128 | 160 | 224 | 256 | 384 | 512 | 多版本 |
安全性 | 弱抗碰撞 | 中抗碰撞 | 高抗碰撞 | 高抗碰撞 | 高抗碰撞 | 高抗碰撞 | 高抗碰撞 |
破解 | 易破解 | 可能破解 | 未被破解 | 未被破解 | 未被破解 | 未被破解 | 未被破解 |
速度 | 快 | 中 | 慢 | 慢 | 慢 | 慢 | 中 |
是否需要种子 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
适用场景 | 数据校验(非安全) | 不推荐 | 密码存储 | 密码存储 | 高安全需求 | 高安全需求 | SHA-2的补充 |
算法名 | BLAKE2 | BLAKE3 | RIPEMD-160 | MurmurHash2 | MurmurHash3 | XXHash | Argon2 |
---|---|---|---|---|---|---|---|
输出bit | 可变(256) | 256 | 160 | 32/64 | 32/128 | 32/64/128 | 160/256 |
安全性 | 高抗碰撞 | 高抗碰撞 | 中抗碰撞 | 非密码学 | 非密码学 | 非密码学 | 高抗碰撞 |
破解 | 未被破解 | 未被破解 | 可能破解 | 不适用 | 不适用 | 不适用 | 未被破解 |
速度 | 快 | 极快 | 中 | 快 | 快 | 极快 | 中 |
是否需要种子 | 否 | 否 | 否 | 可选 | 可选 | 可选 | 是 |
适用场景 | 高性能 | 并行计算 | MD5替代 | 一致性哈希 | 一致性哈希 | 一致性哈希 | 密码存储 |
实现快速秒传功能,可以使用MD5进行一致性校验,但更推荐使用更快的MurmurHash3、XXHash等算法。
如果想要对用户密码存储进行加密的话,则应该使用更加难以破解的算法,SHA系列和Argon2等。
可以选择带种子或加盐的方法防止彩虹表攻击,以提高密码存储的安全性。
一些工具库
1.Google Guava
Guava提供许多hash方法,如md5、murmur3、sha1、sha256、sha512、goodFastHash,下图是其函数文档

使用Google Guava使用MurmurHash3
1 | int murmur = Hashing.murmur3_32().hashString(str, Charsets.UTF_8).asInt(); |
需要注意seed,部分hash算法是需要seed的,这样每一次启动都会存在不同。
2.Hutool
Hutool也提供许多加密方法
1)对称加密 SecureUtil.aes、SecureUtil.des
2)非对称加密SecureUtil.rsa、SecureUtil.dsa
3)摘要加密SecureUtil.md5、SecureUtil.sha1、SecureUtil.hmac、SecureUtil.hmacMd5、SecureUtil.hmacSha1
3.部分工具库未提供的依赖
BLAKE3 Java依赖
Java
1 | groupId:io.github.rctcwyvrn |
字符串hash
Blake3 hasher = Blake3.newInstance();
hasher.update("This is a string".getBytes());
String hexhash = hasher.hexdigest();
文件hash
Blake3 hasher = Blake3.newInstance();
hasher.update(new File(filename));
String filehash = hasher.hexdigest();