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

news2024/11/18 19:53:11

文章目录

  • 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.coloradmin.cn/o/1475980.html

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

相关文章

TikTok云手机可以运营多少个账号

在社交媒体平台上,尤其是像TikTok这样的热门应用中,账号运营已经成为了许多人的日常工作。而利用云手机技术,一台手机能够同时运营多个TikTok账号,为用户带来了更大的便利和灵活性。本文将探讨 TikTok云手机能够运营多少个账号&am…

【生成式AI】ChatGPT原理解析(1/3)- 对ChatGPT的常见误解

Hung-yi Lee 课件整理 文章目录 误解1误解2ChatGPT真正在做的事情-文字接龙 ChatGPT是在2022年12月7日上线的。 当时试用的感觉十分震撼。 误解1 我们想让chatGPT讲个笑话,可能会以为它是在一个笑话的集合里面随机地找一个笑话出来。 我们做一个测试就知道不是这样…

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

【Linux】协程简介

【Linux】协程简介 一、什么是协程?简介优点 二、为什么使用协程?三、协程的种类1、对称协程2、非对称协程 四、协程栈1、静态栈2、分段栈3、共享栈4、虚拟内存栈 五、协程调度1、栈式调度2、星切调度3、环切调度 六、常见协程库参考文献 一、什么是协程…

Spring Task的应用

介绍 Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 定位: 定时任务框架 作用: 定时自动执行某段Java代码 应用场景: 引用卡每月还款提醒、银行贷款每月还款提醒、火车票售票系统处理未支…

SpringCloud(17)之SpringCloud Stream

一、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架,用于构建与共享消息系统连接的高度可扩展的事件驱动微服务。该框架提供了一个灵活的编程模型,该模型建立在已经建立和熟悉的Spring习惯用法和最佳实践之上,包括对持久发布/子语义…

软件性能测试工具RunnerGo安装步骤

现在安装RunnerGo仅需要一条命令!目前支持系统:Centos、Debian、Ubuntu三种。下面给大家介绍一下RunnerGo安装使用流程: Step1:复制以下命令 wget https://img.cdn.apipost.cn/running_go/img/wiki/runnergo.tar && ta…

探索 SPA 与 MPA:前端架构的选择与权衡

查看本专栏目录 关于作者 还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas&#x…

论文阅读-CheckFreq:频繁、精细的DNN检查点操作。

论文名称:CheckFreq: Frequent, Fine-Grained DNN Checkpointing. 摘要 训练深度神经网络(DNNs)是一项资源密集且耗时的任务。在训练过程中,模型在GPU上进行计算,重复地学习权重,持续多个epoch。学习到的权重存在GPU内存中&…

机器遗忘同等重要,AI如何忘记不良数据,保护用户隐私?

引言:大语言模型中的机器遗忘问题 在人工智能领域,大语言模型(LLMs)因其在文本生成、摘要、问答等任务中展现出的卓越能力而备受关注。然而,这些模型在训练过程中可能会记住大量数据,包括敏感或不当的信息…

【MySQL】学习和总结标量子查询

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-kLo6jykc7AcEVEQk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

消息中间件之RocketMQ源码分析(二十二)

Broker主从同步流程 配置数据同步流程 配置数据包含4种类型:Topic配置、消费者位点、延迟位点、订阅关系配置。每种配置数据由一个继承自ConfigManager的类来管理,继承关系如图。Slave如何从Master同步这些配置呢?我们先来看一下初始化服务的步骤 第一步:Maste…

【JavaEE进阶】图书管理系统开发日记——捌

文章目录 🍃前言🎍统一数据返回格式🚩快速入门🚩存在问题🎈问题原因🎈代码修改 🚩统一格式返回的优点 🍀统一异常处理🌲前端代码的修改🚩登录页面&#x1f6a…

openai.CLIP多模态模型简介

介绍 OpenAI CLIP(Contrastive Language–Image Pretraining)是一种由OpenAI开发的多模态学习模型。它能够同时理解图像和文本,并在两者之间建立联系,实现了图像和文本之间的跨模态理解。 如何工作 CLIP模型的工作原理是将来自…

三、软考-系统架构设计师笔记-计算机系统基础知识

计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。 冯诺依曼体系计算机结构: 1、计算机硬件组成 冯诺依曼计算机结构将…

C#理论 —— WPF 应用程序Console 控制台应用

文章目录 1. WPF 应用程序1.1 工程创建1.2 控件1.2.1 控件的公共属性1.2.1 TextBox 文本框1.2.1 Button 按钮 *. Console 控制台应用1.1 工程创建 1. WPF 应用程序 1.1 工程创建 Visual Studio 中新建项目 - 选择WPF 应用程序; 1.2 控件 1.2.1 控件的公共属性 …

2024常用的 Python 自动化测试框架有哪些?

Unittest是Python中最常用的测试框架之一,它提供了丰富和强大的测试工具和方法,可以帮助开发者更好地保证代码质量和稳定性,本文就来介绍下Unittest单元测试框架。 1. 介绍 unittest是Python的单元测试框架,它提供了一套丰富的测…

【MySQL】基本查询(表的增删改查)-- 详解

CRUD:Create(创建),Retrieve(读取),Update(更新),Delete(删除)。 一、Create insert [into] table_name [(column [, column] ...)] v…

硬件工程师入门基础知识(三)钽电容应用(二)

钽电容应用(二) 1.钽电容使用容量选择2.非固体电解质钽电容器使用时应注意的问题2.1 容量和损耗2.2 直流漏电流2.3 使用电压2.4 反向电压2.5 纹波电流2.6 失效率的影响因素2.7 补充说明: 1.钽电容使用容量选择 许多情况下,高能混…

自定义Chrome的浏览器开发者工具DevTools界面的字体和样式

Chrome浏览器开发者工具默认的字体太小,想要修改但没有相关设置。 外观——字体可以自定义字体,但大小不可以调整。 github上有人给出了方法 整理为中文教程: 1.打开浏览器开发者工具,点开设置——实验,勾上红框设…