加密与安全_深入了解哈希算法

文章目录

  • Pre
  • 概述
  • 哈希碰撞
  • 常用的哈希算法
  • Code
    • java.security.MessageDigest
      • MD5
      • SHA-1
      • SHA-256
      • MessageDigest支持算法
  • 哈希算法的用途
  • 彩虹表攻击
    • 基本原理
    • 攻击过程
  • 防御彩虹表攻击
    • 基本原理
    • 用途
  • 小结

在这里插入图片描述


Pre

PKI - 01 散列(Hash)函数

概述

哈希算法(Hash)又称摘要算法(Digest)。

哈希算法是一种重要的加密算法,其核心思想是将任意长度的数据映射为固定长度的哈希值,这个哈希值通常用于验证数据的完整性、索引数据和加速数据查找。

在Java中,hashCode()方法是一种哈希算法的应用。它将字符串映射为一个固定长度的整数值,并满足了哈希算法的两个重要特点:

  • 相同的输入一定会得到相同的输出
  • 不同的输入大概率得到不同的输出。

在实际编程中,我们经常需要根据对象的哈希值来进行数据存储和查找,比如使用哈希表等数据结构。为了确保正确性,如果一个类覆写了equals()方法,就必须同时覆写hashCode()方法,以保证相同的对象具有相同的哈希值,从而确保在基于哈希值的数据结构中能够正确地执行查找、插入和删除操作。


哈希碰撞

哈希碰撞指的是在哈希算法中,两个不同的输入数据经过哈希函数运算后产生了相同的哈希值。也就是说,两个不同的输入数据经过哈希函数计算后得到的哈希值是一样的。这种情况被称为哈希碰撞。

哈希碰撞可能会导致一些问题,特别是在哈希表等数据结构中。因为哈希表是通过哈希值来确定数据存储位置的,如果两个不同的键具有相同的哈希值,就会发生冲突。在发生冲突时,通常会有一些解决冲突的方法,比如链地址法、开放寻址法等。

虽然绝对避免哈希碰撞是不可能的,但好的哈希函数会尽量降低碰撞的概率。通常情况下,当输入数据足够大,哈希函数的设计足够均匀时,哈希碰撞的概率会很低。因此,在选择哈希算法和设计哈希函数时,需要考虑到哈希碰撞的可能性,尽量选择高效且低碰撞的哈希函数。


常用的哈希算法

算法输出长度(位)输出长度(字节)
MD5128 bits16 bytes
SHA-1160 bits20 bytes
RipeMD-160160 bits20 bytes
SHA-256256 bits32 bytes
SHA-512512 bits64 bytes
  1. MD5(Message Digest Algorithm 5)
  • 输出长度为128位(16字节)。
  • MD5是一种常见的哈希算法,用于产生数据的哈希值或摘要。它广泛用于安全领域和数据完整性验证中。然而,由于存在一些已知的安全漏洞,MD5已经不再安全,因此不推荐在安全性要求较高的场景中使用。
  1. SHA-1(Secure Hash Algorithm 1)
  • 输出长度为160位(20字节)。
  • SHA-1是SHA系列算法的一种,也是一种常用的哈希算法。与MD5类似,SHA-1也被广泛应用于数据完整性验证和安全领域。然而,由于其输出长度较短,SHA-1也已经被证明不再安全,不适合用于对抗有组织的攻击。
  1. RipeMD-160
  • 输出长度为160位(20字节)。
  • RipeMD-160是一种基于MD4的消息摘要算法,它提供了和SHA-1相似的输出长度,但使用了不同的设计原理。RipeMD-160在某些场景下仍然被使用,但由于其较短的输出长度,也不适合用于对抗有组织的攻击。
  1. SHA-256(Secure Hash Algorithm 256)
  • 输出长度为256位(32字节)。
  • SHA-256是SHA系列算法的一种,输出长度比SHA-1更长,提供了更高的安全性。SHA-256在密码学中被广泛应用,用于生成数字签名、消息认证码等安全机制。
  1. SHA-512(Secure Hash Algorithm 512)
  • 输出长度为512位(64字节)。
  • SHA-512是SHA系列算法中输出长度最长的一种,提供了更高的安全性和抗碰撞能力。SHA-512适用于对抗更严格的安全攻击,如密码学中的高级加密标准(AES)等。

根据碰撞概率,哈希算法的输出长度越长,就越难产生碰撞,也就越安全。

这些哈希算法都是公开的,并在不同的场景中得到了广泛的应用。在选择使用哪种哈希算法时,应根据具体的安全需求和性能要求进行评估。


Code

Java标准库提供了常用的哈希算法,并且有一套统一的接口。

java.security.MessageDigest

MD5

Java标准库中提供了MessageDigest类,可以用于计算消息的摘要,包括MD5摘要

package com.artisan.securityalgjava.hashcode;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;/*** MD5工具类,用于计算输入字符串的MD5哈希值。*/
public class MD5Utils {/*** 主方法,用于演示MD5哈希值的计算。*/public static void main(String[] args) throws NoSuchAlgorithmException {// 计算字符串"HelloWorld"的MD5哈希值并输出结果System.out.println(getMD5("HelloWorld"));}/*** 计算输入字符串的MD5哈希值。* @param input 输入字符串* @return 输入字符串的MD5哈希值*/public static String getMD5(String input) throws NoSuchAlgorithmException {// 获取MD5消息摘要实例MessageDigest md = MessageDigest.getInstance("MD5");// 计算输入字符串的哈希值byte[] hashInBytes = md.digest(input.getBytes(StandardCharsets.UTF_8));// 将字节数组转换为十六进制字符串表示StringBuilder sb = new StringBuilder();for (byte b : hashInBytes) {sb.append(String.format("%02x", b));}return sb.toString();}
}

在这里插入图片描述


SHA-1

MessageDigest md = MessageDigest.getInstance("SHA-1");

在这里插入图片描述


SHA-256

 MessageDigest md = MessageDigest.getInstance("SHA-256");

在这里插入图片描述


MessageDigest支持算法

MessageDigest类支持的哈希算法取决于Java平台的实现,但通常情况下,它支持以下标准的哈希算法:

  1. MD2:较早的一种消息摘要算法,已经不推荐使用。
  2. MD5:较早的一种消息摘要算法,已经不推荐使用。
  3. SHA-1:SHA(Secure Hash Algorithm)家族中的一种,输出长度为160位。
  4. SHA-256:SHA(Secure Hash Algorithm)家族中的一种,输出长度为256位。
  5. SHA-384:SHA(Secure Hash Algorithm)家族中的一种,输出长度为384位。
  6. SHA-512:SHA(Secure Hash Algorithm)家族中的一种,输出长度为512位。

在使用MessageDigest.getInstance(String algorithm)方法时,可以传入以上算法名称来获取对应的MessageDigest实例。 如果指定的算法名称不被支持,会抛出NoSuchAlgorithmException异常。

https://docs.oracle.com/en/java/javase/14/docs/specs/security/standard-names.html#messagedigest-algorithms

在这里插入图片描述


哈希算法的用途

哈希算法在计算机科学和信息安全领域中有许多重要的用途,包括但不限于以下几个方面:

  1. 数据完整性验证:哈希算法可以用于验证数据的完整性,确保数据在传输或存储过程中没有被篡改。接收方可以通过比对接收到的数据的哈希值与发送方发送的哈希值是否一致来判断数据是否完整,这种技术在文件下载、软件更新等场景中经常被使用。

  2. 密码学中的数字签名:哈希算法可以用于生成数字签名,用于验证数据的来源和完整性。发送方可以通过将数据的哈希值使用私钥进行加密生成数字签名,并将数字签名附加在数据上发送给接收方。接收方可以使用发送方的公钥解密数字签名并计算数据的哈希值,然后比对两者是否一致,以验证数据的来源和完整性。

  3. 密码学中的消息认证码(MAC):哈希算法可以用于生成消息认证码,用于验证数据的完整性和认证数据的来源。与数字签名不同的是,消息认证码是使用对称密钥算法生成的,发送方和接收方共享同一个密钥,发送方使用密钥对数据的哈希值进行加密生成消息认证码,接收方使用相同的密钥解密消息认证码并计算数据的哈希值,然后比对两者是否一致。

  4. 密码学中的密码散列函数:哈希算法可以用于密码散列函数,用于存储用户密码的哈希值而不是明文密码。在用户注册时,系统会将用户密码的哈希值存储在数据库中,而不是明文密码,以提高密码安全性。当用户登录时,系统会对用户输入的密码进行哈希计算,并与数据库中存储的哈希值进行比对,以验证用户的身份。

  5. 数据结构中的哈希表:哈希算法可以用于实现哈希表数据结构,用于快速存储和查找数据。哈希表将数据的关键字通过哈希函数映射为表中的索引,从而实现快速的数据存取操作。在计算机科学中,哈希表是一种非常重要的数据结构,被广泛应用于各种算法和数据处理中。


彩虹表攻击

彩虹表攻击是一种用于破解哈希算法的方法,特别是对于存储密码的系统来说,这种攻击具有一定的威胁性。

基本原理

  1. 密码哈希存储:在许多系统中,用户的密码不会以明文形式存储在数据库中,而是经过哈希算法处理后的摘要(哈希值)存储。
  2. 彩虹表:彩虹表是一种预先计算出的密码哈希值与其对应明文密码之间的映射表。这些表可以通过对常见密码、密码组合和哈希算法的计算来生成。

攻击过程

  1. 获取哈希值:攻击者首先需要获取到目标系统存储的密码哈希值。
  2. 匹配哈希值:攻击者将获取到的哈希值与彩虹表中的哈希值进行匹配。
  3. 破解密码:如果找到了匹配的哈希值,则攻击者可以从彩虹表中查找对应的明文密码,从而实现对目标账户的破解。

防御彩虹表攻击

加盐(salt)是一种增强密码哈希安全性的方法,它通过为每个密码添加随机数(盐),使得相同的密码在经过哈希处理后得到的摘要也会不同。这样一来,即使用户使用了常见口令,黑客也无法使用预先计算好的彩虹表来破解密码,因为每个密码都需要单独计算其哈希值。

下面是加盐密码存储的基本原理和用途:

基本原理

  1. 随机盐值:对于每个用户的密码,都生成一个随机的盐值,并将其与用户输入的密码结合起来。
  2. 密码哈希处理:将盐值与用户输入的密码连接起来,然后将连接后的字符串进行哈希处理,生成最终的摘要。

举个例子:

digest = md5(salt+inputPassword)

经过加盐处理的数据库表,内容如下:

usernamesaltpassword
bobH1r0aa5022319ff4c56955e22a74abcc2c210
alice7$p2we5de688c99e961ed6e560b972dab8b6a
timz5Sk91eee304b92dc0d105904e7ab58fd2f64

加盐的目的在于使黑客的彩虹表失效,即使用户使用常用口令,也无法从MD5反推原始口令。


用途

  1. 增强安全性:加盐可以有效地防止彩虹表攻击,提高密码存储的安全性。即使用户使用了常见口令,也不会因为哈希冲突而导致密码泄露。
  2. 个性化保护:每个用户都有自己独特的盐值,即使两个用户使用相同的密码,其哈希值也会不同,从而保护用户的个人信息安全。
  3. 降低碰撞风险:通过加盐处理,可以有效降低哈希碰撞的风险,提高密码存储的完整性和可靠性。

综上所述,加盐是一种简单而有效的密码存储增强方法,可以有效地抵御彩虹表攻击,提高系统的安全性和用户密码的保密性。


小结

  1. 验证数据完整性:哈希算法可以生成数据的唯一摘要,用于验证数据的完整性,任何对原始数据的篡改都会导致哈希值的变化,从而可以检测到数据是否被篡改。

  2. 常用的哈希算法:MD5、SHA-1、SHA-2** 等是常见的哈希算法,用于生成数据的哈希值。尽管 MD5 已经不推荐用于安全应用,但在某些场景下仍然可以用于非安全目的,比如数据完整性验证。

  3. 防止彩虹表攻击:在存储密码等敏感信息时,使用哈希算法进行加密是一种常见的做法。然而,为了防止彩虹表攻击,需要对每个密码额外添加随机数(盐值)进行加盐处理,增加破解的难度,提高密码存储的安全性。

哈希算法在信息安全领域有着广泛的应用,能够帮助我们保护数据的完整性、验证身份以及存储密码等敏感信息。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 异常处理

异常类 .NET Framework 类库中的所有异常都派生于 Exception 类,异常包括系统异常和应用异常。 默认所有系统异常派生于 System.SystemException,所有的应用程序异常派生于 System.ApplicationException。 系统异常一般不可预测,比如内存堆…

python中版本,操作系统等问题汇总

1. linux源码部署到windows 1.1ModuleNotFoundError: No module named pwd 这个问题&#xff0c;是因为源码是给linux的。这里在windows中&#xff0c;没有该命令。 解决方法之一&#xff0c;在相应的环境目录中&#xff0c;如图中<MetaGPTenv>虚拟环境中&#xff0c;在…

nginx(三)实现反向代理客户端 IP透传

正常情况下&#xff0c;客户端去访问代理服务器&#xff0c;然后代理服务器再取访问真实服务器&#xff0c;在真实服务器上&#xff0c;只能显示代理服务器的ip地址&#xff0c;而不显示客户端的ip地址&#xff0c;如果想让客户端的ip地址也能在真实服务端看见&#xff0c;这一…

Excel数据表定制分组排序

实例需求&#xff1a;某学校体育活动统计表如下图左侧表格所示&#xff0c;数据按照班级排列&#xff0c;现在需要根据如下规格对表格进行排序 “幼儿”班级排列在表格最后按照“次数”降序排列“幼儿”班级同样按“次数”降序排列 排序结果如下图中右侧表格所示。 示例代码…

基于springboot+vue的保险信息网站(源码+论文)

文章目录 文章目录 前言 一、功能设计 二、功能实现 2.1 前台功能设计 2.1.1 网站首页 2.1.2 保险产品列表 2.1.3 留言板界面 2.1.4 产品查询界面 2.2后台管理设计 2.2.1 系统用户登录管理 三、库表设计 四、论文 前言 随着互联网的不断发展&#xff0c;现在人们获…

mybatis基础操作(二)

事务管理 获取sqlSession时&#xff0c;默认开启事务&#xff0c;SqlSessionFactory类实例在调用openSession时不设置或者设置为false&#xff0c;此情况下&#xff0c;操作完成后&#xff0c;需要手动提交。 手动提交与回滚事务 public void insertStudent() {// 会话链接S…

Apache Bench(ab )压力测试

目录 参数说明示例1&#xff1a;压力测试示例2&#xff1a;测试post接口post数据文件该如何编写&#xff1f; apr_pollset_poll: The timeout specified has expired (70007)apr_socket_recv: Connection reset by peer (104)参考 参数说明 官方文档参考这里。 ab -c 100 -n …

解决vscode内置视图npm脚本操作报权限问题

项目背景 当我们使用 vscode 运行NPM脚本时却爆红了&#xff0c;提示系统上禁止运行脚本。 解决思路 竟然提示权限不够&#xff0c;那么咱们就从系统权限出发&#xff0c;vscode右键以管理员身份运行 在集成终端中输入一下命令 # get-executionpolicy是PowerShell中的命令,用…

人工智能水印技术入门:工具与技巧

近几个月来&#xff0c;我们看到了多起关于“深度伪造 (deepfakes)”或人工智能生成内容的新闻报道&#xff1a;从 泰勒斯威夫特的图片、汤姆汉克斯的视频 到 美国总统乔拜登的录音。这些深度伪造内容被用于各种目的&#xff0c;如销售产品、未经授权操纵人物形象、钓鱼获取私人…

学不动系列-eslint

ESLint 介绍在最简单的项目使用eslint,包括eslint的vscode插件的使用&#xff0c;自动化格式代码&#xff0c;自动化修复代码&#xff0c;和webpack&#xff0c;vite的配合使用 单独使用 第一步&#xff1a;构建一个空项目 npm init -y 在根目录新建文件./src/app.js&#…

[spark] RDD 编程指南(翻译)

Overview 从高层次来看&#xff0c;每个 Spark 应用程序都包含一个driver program&#xff0c;该程序运行用户的main方法并在集群上执行各种并行操作。 Spark 提供的主要抽象是 resilient distributed dataset&#xff08;RDD)&#xff0c;它是跨集群节点分区的元素集合&…

生成对抗网络

生成对抗网络 GAN 什么是GAN GAN含义&#xff1a;生成对抗网络&#xff08;Generative Adversarial Networks&#xff09;&#xff0c;主要做目标判别&#xff0c;应用在图像分类、语义分割、目标检测。 GAN简述&#xff1a;GAN包括生成器Generator(G)、判别模型Discriminat…

【架构之路】糟糕程序员的20个坏习惯,切记要改掉

文章目录 强烈推荐前言&#xff1a;坏习惯:总结&#xff1a;强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 前言&#xff1a; 优秀的程序员…

关于电脑一天24小时多少度电电脑的一天用电量计算

随着这几年物价的上涨&#xff0c;一些地区的电价越来越高&#xff0c;而我们经常需要使用电脑&#xff0c;那么一台电脑一天24小时用多少度电呢&#xff1f; 如何计算电脑一天的用电量&#xff1f; 让我们跟随小编来了解更多吧。 1、功耗、主机箱功耗 现在的计算机中&#xf…

DTD、XML阐述、XML的两种文档类型约束和DTD的使用

目录 ​编辑 一、DTD 什么是DTD&#xff1f; 为什么要使用 DTD&#xff1f; 内部 DTD 声明 具有内部 DTD 的 XML 文档 外部 DTD 声明 引用外部 DTD 的 XML 文档 二、XML 什么是XML&#xff1f; XML 不执行任何操作 XML 和 HTML 之间的区别 XML 不使用预定义的标记…

js 面试 什么是WebSockets?HTTP和HTTPS有什么不同?web worker是什么?

概念&#xff1a; webSocket 是一种在客户端和服务端之间建立持久连接的协议&#xff0c;它提供全双工通信通道&#xff0c;是服务器可以主动向客户端推送数据&#xff0c;同时也可以接受客户端发送的数据。 1 webSocket与https区别&#xff1f; 在网络通信中&#xff0c;We…

SVN教程-SVN的基本使用

SVN&#xff08;Apache Subversion&#xff09;是一款强大的集中式版本控制系统&#xff0c;它在软件开发项目中扮演着至关重要的角色&#xff0c;用于有效地跟踪、记录和管理代码的演变过程。与分布式系统相比&#xff0c;SVN 的集中式架构使得团队能够更加协同地进行开发&…

如何进行写作的刻意练习

写作从来不可能一蹴而就&#xff0c;而是一件需要我们持续坚持、努力的事情。 人如果没有目标就会迷失方向&#xff0c; 既然需要长期的坚持&#xff0c;就需要我们根据自身情况制定每一阶段的目标。 目标的制定要清晰可达&#xff0c;不能模棱两可&#xff0c;要认证对待。 …

基于springboot+vue的二手手机管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【Vue】插槽-slot

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 插槽 作用&#xff1a;让组件内部一些 结构 支持 自定义 插槽的分类&#xff1a; 默认插槽。具名插槽。 基础语法 组件内需要定制的结构部分&…