0%

Hashes

常见算法及其特点

算法名MD5SHA-1SHA-224SHA-256SHA-384SHA-512SHA-3
输出bit128160224256384512多版本
安全性弱抗碰撞中抗碰撞高抗碰撞高抗碰撞高抗碰撞高抗碰撞高抗碰撞
破解易破解可能破解未被破解未被破解未被破解未被破解未被破解
速度
是否需要种子
适用场景数据校验(非安全)不推荐密码存储密码存储高安全需求高安全需求SHA-2的补充
算法名BLAKE2BLAKE3RIPEMD-160MurmurHash2MurmurHash3XXHashArgon2
输出bit可变(256)25616032/6432/12832/64/128160/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
2
3
groupId:io.github.rctcwyvrn
artifactId:blake3
version:1.3

字符串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();