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

文章目录

  • 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.hqwc.cn/news/506403.html

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

相关文章

9.8分割等和子集(LC416-M)

算法: 可以转换为背包问题: 一个商品如果可以重复多次放入是完全背包,而只能放入一次是01背包,写法还是不一样的。 要明确本题中我们要使用的是01背包,因为元素我们只能用一次。 只有确定了如下四点,才能…

数字化导师坚鹏:证券公司数字化运营三步曲之认知、行动、结果

证券公司数字化运营三步曲之认知、行动、结果 课程背景: 很多证券公司都在开展数字化运营工作,目前存在以下问题急需解决: 不清楚证券公司数字化运营包括哪些关键工作? 不清楚证券公司数字化运营工作的核心方法论&#xff1f…

2024年盘点Mac上的那些强大好用的系统清理软件

现如今MacOS上的系统维护清理软件层出不穷,选择一款合适的系统工具是我们的当务之急,下边就带你盘点一下Mac上的那些优秀好用的系统清理软件,看看哪款你最喜欢吧! ​ 1、App Cleaner & Uninstaller Pro App Cleaner mac版是…

Docker知识点总结

二、Docker基本命令: Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装,安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker: yum install docker -y -y 表示自动确认…

【精华】麻省理工学院MIT技术双月刊(Bimonthly MIT Technology Review)2024年3/4月刊荐书 Book reviews

本期内容概览见博客:2024年3/4月刊内容概览 Book Reviews 1. Read Write Own: Building the Next Era of the Internet By Chris Dixon (Random House, 2024) With the demise of Twitter, many have advocated for a decentralized alternative for social medi…

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用,gofly框架内置校验工具,提供开发效率,开发接口简单调用即可实现验证,下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…

笨办法学 Python3 第五版(预览)(一)

原文:Learn Python the Hard Way, 5th Edition (Early Release) 译者:飞龙 协议:CC BY-NC-SA 4.0 模块 1:Python 入门 练习 0:准备工作 这个练习没有代码。这只是你完成的练习,让你的计算机运行 Python。…

flurl升级之后没有FlurlNewtonsoftJsonSerializer

新建NewtonsoftJsonSerializer.cs /// <summary> /// ISerializer implementation based on Newtonsoft.Json. /// Default serializer used in calls to GetJsonAsync, PostJsonAsync, etc. /// </summary> public class NewtonsoftJsonSerializer : IJsonSerial…

【PDF技巧】网上下载的pdf文件怎么才能编辑

不知道大家有没有遇到过网上下载的PDF文件不能编辑的情况&#xff0c;今天我们来详细了解一下导致无法编辑的原因即解决方法有哪些。 第一种原因&#xff1a;PDF文件中的内容是否是图片&#xff0c;如果确认是图片文件&#xff0c;那么我们想要编辑&#xff0c;就可以先使用PD…

程序员把年终复盘交给AI-复利再投

1.复盘重要但不紧急 在做年末总结时&#xff0c;复盘&#xff0c;改进计划&#xff0c;这是我觉得最重要的一段时间&#xff0c;它不紧急&#xff0c;但是极其重要。 年底的复盘就像把今年的收获&#xff0c;转移到一个复利账户里&#xff0c;提取的经验越多&#xff0c;来年…

论文阅读_代码生成模型_CodeLlama

英文名称: Code Llama: Open Foundation Models for Code 中文名称: Code Llama&#xff1a;开放基础代码模型 链接: https://arxiv.org/abs/2308.12950 代码: https://github.com/facebookresearch/codellama 作者: Baptiste Rozire, Jonas Gehring, Fabian Gloeckle, Sten So…

USLE模型-P因子的计算

首先需要下载土地利用类型数据集&#xff0c;查看我的相关文章 对于已有的10种土地类型代码&#xff0c;需要按水土保持措施P值表进行重分类。 10是耕地&#xff0c;且庆阳市坡度10-15度左右&#xff0c;所以赋给了3&#xff08;最好再下个DEM计算一下&#xff0c;这里就统一用…