1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

[docs update]完善对哈希算法的介绍

This commit is contained in:
Guide 2024-01-04 21:12:31 +08:00
parent d49af05a16
commit 164f98c74f
3 changed files with 23 additions and 19 deletions

View File

@ -6,11 +6,6 @@
[![logo](https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png)](https://github.com/Snailclimb/JavaGuide) [![logo](https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png)](https://github.com/Snailclimb/JavaGuide)
[![阅读](https://img.shields.io/badge/阅读-read-brightgreen.svg)](https://javaguide.cn/)
![Stars](https://img.shields.io/github/stars/Snailclimb/JavaGuide)
![forks](https://img.shields.io/github/forks/Snailclimb/JavaGuide)
![issues](https://img.shields.io/github/issues/Snailclimb/JavaGuide)
[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide) [GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)
</div> </div>

View File

@ -346,7 +346,7 @@ Spring 框架中用到了哪些设计模式?
- 《Spring 技术内幕》 - 《Spring 技术内幕》
- <https://blog.eduonix.com/java-programming-2/learn-design-patterns-used-spring-framework/> - <https://blog.eduonix.com/java-programming-2/learn-design-patterns-used-spring-framework/>
- <http://blog.yeamin.top/2018/03/27/单例模式-Spring%20单例实现原理分析/> - <http://blog.yeamin.top/2018/03/27/单例模式-Spring%20 单例实现原理分析/>
- <https://www.tutorialsteacher.com/ioc/inversion-of-control> - <https://www.tutorialsteacher.com/ioc/inversion-of-control>
- <https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html> - <https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html>
- <https://juejin.im/post/5a8eb261f265da4e9e307230> - <https://juejin.im/post/5a8eb261f265da4e9e307230>

View File

@ -16,7 +16,7 @@ tag:
## 哈希算法 ## 哈希算法
哈希算法也叫哈希函数、散列函数或摘要算法,它的作用是对任意长度的数据生成一个固定长度的唯一标识,也叫哈希值、散列值或消息摘要(后文统称为哈希值)。 哈希算法也叫哈希算法、散列函数或摘要算法,它的作用是对任意长度的数据生成一个固定长度的唯一标识,也叫哈希值、散列值或消息摘要(后文统称为哈希值)。
![哈希算法效果演示](https://oss.javaguide.cn/github/javaguide/system-design/security/encryption-algorithms/hash-function-effect-demonstration.png) ![哈希算法效果演示](https://oss.javaguide.cn/github/javaguide/system-design/security/encryption-algorithms/hash-function-effect-demonstration.png)
@ -24,25 +24,32 @@ tag:
举两个实际的例子: 举两个实际的例子:
- 我们下载一个文件时,可以通过比较文件的哈希值和官方提供的哈希值是否一致,来判断文件是否被篡改或损坏;
- 保存密码到数据库时使用哈希算法进行加密,可以通过比较用户输入密码的哈希值和数据库保存的哈希值是否一致,来判断密码是否正确。 - 保存密码到数据库时使用哈希算法进行加密,可以通过比较用户输入密码的哈希值和数据库保存的哈希值是否一致,来判断密码是否正确。
- 我们下载一个文件时,可以通过比较文件的哈希值和官方提供的哈希值是否一致,来判断文件是否被篡改或损坏;
这种算法的特点是不可逆: 这种算法的特点是不可逆:
- 不能从哈希值还原出原始数据。 - 不能从哈希值还原出原始数据。
- 原始数据的任何改变都会导致哈希值的巨大变化。 - 原始数据的任何改变都会导致哈希值的巨大变化。
哈希算法主要下面几类: 哈希算法分为两类:
- MDMessage Digest消息摘要算法比如 MD5。 - **加密哈希算法**安全性较高的哈希算法它可以提供一定的数据完整性保护和数据防篡改能力能够抵御一定的攻击手段安全性相对较高适用于对安全性要求较高的场景。例如SHA-256、SHA-512、SM3、Bcrypt 等等。
- SHASecure Hash Algorithm安全哈希算法比如 SHA-1、SHA-256。 - **非加密哈希算法**安全性相对较低的哈希算法易受到暴力破解、冲突攻击等攻击手段的影响但性能较高适用于对安全性没有要求的业务场景。例如CRC32、MurMurHash3 等等。
- MACMessage Authentication Code消息认证码算法比如 HMAC(Hash Message Authentication Code)。
- 其他国密算法SM3、密码哈希算法Bcrypt 常见的哈希算法有:
- MDMessage Digest消息摘要算法MD2、MD4、MD5 等,已经不被推荐使用。
- SHASecure Hash Algorithm安全哈希算法SHA-1 系列安全性低SHA2SHA3 系列安全性较高。
- 国密算法:例如 SM2、SM3、SM4其中 SM2 为非对称加密算法SM4 为对称加密算法SM3 为哈希算法(安全性及效率和 SHA-256 相当,但更适合国内的应用环境)。
- Bcrypt密码哈希算法基于 Blowfish 加密算法的密码哈希算法,专门为密码加密而设计,安全性高。
- MACMessage Authentication Code消息认证码算法HMAC 是一种基于哈希的 MAC可以与任何安全的哈希算法结合使用例如 SHA-256。
- CRCCyclic Redundancy Check循环冗余校验CRC32 是一种 CRC 算法,它的特点是生成 32 位的校验值,通常用于数据完整性校验、文件校验等场景。
- SipHash加密哈希算法它的设计目的是在速度和安全性之间达到一个平衡用于防御[哈希泛洪 DoS 攻击](https://aumasson.jp/siphash/siphashdos_29c3_slides.pdf)。Rust 默认使用 SipHash 作为哈希算法,从 Redis4.0 开始,哈希算法被替换为 SipHash。
- MurMurHash经典快速的非加密哈希算法目前最新的版本是 MurMurHash3可以生成 32 位或者 128 位哈希值;
- …… - ……
国密算法常见的如 SM2、SM3、SM4其中 SM2 为非对称加密算法SM4 为对称加密算法SM3 为哈希算法(安全性及效率和 SHA-256 相当,但更适合国内的应用环境)。 哈希算法一般是不需要密钥的但也存在部分特殊哈希算法需要密钥。例如MAC 和 SipHash 就是一种基于密钥的哈希算法,它在哈希算法的基础上增加了一个密钥,使得只有知道密钥的人才能验证数据的完整性和来源。
哈希算法一般是不需要密钥的但也存在部分特殊哈希算法需要密钥。例如MAC 算法就是一种基于密钥的哈希算法,它在哈希算法的基础上增加了一个密钥,使得只有知道密钥的人才能验证数据的完整性和来源。
### MD ### MD
@ -82,13 +89,13 @@ SHA-256 Hash: fb246796f5b1b60d4d0268c817c608fa
### SHA ### SHA
SHASecure Hash Algorithm系列算法是一组密码哈希函数用于将任意长度的数据映射为固定长度的哈希值。SHA 系列算法由美国国家安全局NSA于 1993 年设计,目前共有 SHA-1、SHA-2、SHA-3 三种版本。 SHASecure Hash Algorithm系列算法是一组密码哈希算法用于将任意长度的数据映射为固定长度的哈希值。SHA 系列算法由美国国家安全局NSA于 1993 年设计,目前共有 SHA-1、SHA-2、SHA-3 三种版本。
SHA-1 算法将任意长度的数据映射为 160 位的哈希值。然而SHA-1 算法存在一些严重的缺陷比如安全性低容易受到碰撞攻击和长度扩展攻击。因此SHA-1 算法已经不再被推荐使用。 SHA-2 家族(如 SHA-256、SHA-384、SHA-512 等)和 SHA-3 系列是 SHA-1 算法的替代方案,它们都提供了更高的安全性和更长的哈希值长度。 SHA-1 算法将任意长度的数据映射为 160 位的哈希值。然而SHA-1 算法存在一些严重的缺陷比如安全性低容易受到碰撞攻击和长度扩展攻击。因此SHA-1 算法已经不再被推荐使用。 SHA-2 家族(如 SHA-256、SHA-384、SHA-512 等)和 SHA-3 系列是 SHA-1 算法的替代方案,它们都提供了更高的安全性和更长的哈希值长度。
SHA-2 家族是在 SHA-1 算法的基础上改进而来的,它们采用了更复杂的运算过程和更多的轮次,使得攻击者更难以通过预计算或巧合找到碰撞。 SHA-2 家族是在 SHA-1 算法的基础上改进而来的,它们采用了更复杂的运算过程和更多的轮次,使得攻击者更难以通过预计算或巧合找到碰撞。
为了寻找一种更安全和更先进的密码哈希函数美国国家标准与技术研究院National Institute of Standards and Technology简称 NIST在 2007 年公开征集 SHA-3 的候选算法。NIST 一共收到了 64 个算法方案,经过多轮的评估和筛选,最终在 2012 年宣布 Keccak 算法胜出,成为 SHA-3 的标准算法SHA-3 与 SHA-2 算法没有直接的关系)。 Keccak 算法具有与 MD 和 SHA-1/2 完全不同的设计思路即海绵结构Sponge Construction使得传统攻击方法无法直接应用于 SHA-3 的攻击中(能够抵抗目前已知的所有攻击方式包括碰撞攻击、长度扩展攻击、差分攻击等)。 为了寻找一种更安全和更先进的密码哈希算法美国国家标准与技术研究院National Institute of Standards and Technology简称 NIST在 2007 年公开征集 SHA-3 的候选算法。NIST 一共收到了 64 个算法方案,经过多轮的评估和筛选,最终在 2012 年宣布 Keccak 算法胜出,成为 SHA-3 的标准算法SHA-3 与 SHA-2 算法没有直接的关系)。 Keccak 算法具有与 MD 和 SHA-1/2 完全不同的设计思路即海绵结构Sponge Construction使得传统攻击方法无法直接应用于 SHA-3 的攻击中(能够抵抗目前已知的所有攻击方式包括碰撞攻击、长度扩展攻击、差分攻击等)。
由于 SHA-2 算法还没有出现重大的安全漏洞,而且在软件中的效率更高,所以大多数人还是倾向于使用 SHA-2 算法。 由于 SHA-2 算法还没有出现重大的安全漏洞,而且在软件中的效率更高,所以大多数人还是倾向于使用 SHA-2 算法。
@ -125,7 +132,7 @@ SHA-256 Hash: 184eb7e1d7fb002444098c9bde3403c6f6722c93ecfac242c0e35cd9ed3b41cd
### Bcrypt ### Bcrypt
Bcrypt 算法是一种基于 Blowfish 加密算法的密码哈希函数,专门为密码加密而设计,安全性高。 Bcrypt 算法是一种基于 Blowfish 加密算法的密码哈希算法,专门为密码加密而设计,安全性高。
由于 Bcrypt 采用了 salt 和 cost成本 两种机制它可以有效地防止彩虹表攻击和暴力破解攻击从而保证密码的安全性。salt 是一个随机生成的字符串用于和密码混合增加密码的复杂度和唯一性。cost 是一个数值参数,用于控制 Bcrypt 算法的迭代次数,增加密码哈希的计算时间和资源消耗。 由于 Bcrypt 采用了 salt 和 cost成本 两种机制它可以有效地防止彩虹表攻击和暴力破解攻击从而保证密码的安全性。salt 是一个随机生成的字符串用于和密码混合增加密码的复杂度和唯一性。cost 是一个数值参数,用于控制 Bcrypt 算法的迭代次数,增加密码哈希的计算时间和资源消耗。
@ -353,6 +360,8 @@ DSA 算法签名过程:
## 参考 ## 参考
- 深入理解完美哈希 - 腾讯技术工程https://mp.weixin.qq.com/s/M8Wcj8sZ7UF1CMr887Puog
- 写给开发人员的实用密码学(二)—— 哈希函数https://thiscute.world/posts/practical-cryptography-basics-2-hash/
- 奇妙的安全旅行之 DSA 算法:<https://zhuanlan.zhihu.com/p/347025157> - 奇妙的安全旅行之 DSA 算法:<https://zhuanlan.zhihu.com/p/347025157>
- AES-GCM 加密简介:<https://juejin.cn/post/6844904122676690951> - AES-GCM 加密简介:<https://juejin.cn/post/6844904122676690951>
- Java AES 256 GCM Encryption and Decryption Example | JCE Unlimited Strength<https://www.javainterviewpoint.com/java-aes-256-gcm-encryption-and-decryption/> - Java AES 256 GCM Encryption and Decryption Example | JCE Unlimited Strength<https://www.javainterviewpoint.com/java-aes-256-gcm-encryption-and-decryption/>