加解密系列之Hash算法


一、算法简介

哈希算法(Hash Algorithm)是一种将任意长度的数据转换为固定长度输出的算法。这个输出通常是一个二进制字符串,称为哈希值、散列值或消息摘要。哈希算法具有以下主要特性:
1、确定性:相同的输入总是产生相同的哈希值。
2、快速计算: 对于任何给定的输入,哈希值可以快速计算出来。
3、不可逆性: 从哈希值反推原始输入数据在计算上是不可行的,即很难通过哈希值找到原始的输入数据。
4、雪崩效应: 即使输入数据有微小的变化,产生的哈希值也会有很大的不同。
5、唯一性: 理想情况下,不同的输入应该产生不同的哈希值,但实际上由于哈希值长度有限,存在发生碰撞(两个不同的输入产生相同哈希值)的可能性,但优秀的哈希算法会使这种可能性极低。
常见的哈希算法包括:
MD5: Message Digest 5,产生128位(16字节)的哈希值。尽管MD5曾经非常流行,但由于安全性的原因,现在不再推荐用于安全性要求高的场景(现在密码存储及验证一般选用BCrypt或Argon2这种密码散列算法来防止暴力破解或彩虹表攻击
SHA系列:
SHA-1: Secure Hash Algorithm 1,产生160位(20字节)的哈希值。虽然比MD5更安全,但现在也因为已知的碰撞攻击而不再建议使用。
SHA-256/SHA-512: 属于SHA-2家族,分别产生256位和512位的哈希值。这些算法目前被认为是安全的,并被广泛使用。
SHA-3: 是NIST组织的一次竞赛中胜出的算法,与SHA-2不兼容,提供额外的安全保障。
哈希算法在密码学中有多种用途,如数据完整性检查、数字签名、安全存储密码等。在区块链技术中,哈希算法也是构建区块的基础,确保了链上的数据不可篡改。


二、算法规则

哈希算法的算法规则依赖于具体实现的算法类型,但大多数哈希函数遵循一些共同的原则和结构。下面是一些通用的算法规则,以SHA-256(一种安全散列算法)为例进行说明,尽管这些原则也适用于其他哈希算法,如MD5、SHA-1、SHA-3等。

  1. 初始化
    算法开始时,会初始化一组寄存器(通常是一系列的固定值),这些寄存器将参与后续的运算。
  2. 预处理
    输入数据会被预处理,通常包括:
    (1)填充:如果输入数据的长度不是算法所要求的块大小的倍数,会在数据末尾添加一些比特,通常是1比特的’1’后跟足够多的’0’比特,直到整个消息的长度加上原始长度编码后的长度达到某个特定的模数。
    (2)附加原始长度:在填充后的数据末尾添加原始消息的长度,通常是64位或128位,以便算法能够知道原始输入的大小。
  3. 分块
    预处理后的数据被分成一系列固定大小的块,每个块的大小取决于具体的算法(例如,SHA-256的块大小是512位)。
  4. 哈希处理
    对每个块执行迭代的处理,这通常包括:
    (1)扩展:将输入块扩展成一系列词,这一步可能涉及循环左移、异或等操作。
    (2)压缩函数:使用压缩函数处理每个词,这通常涉及复杂的布尔逻辑运算、加法、循环左移和常量加法。压缩函数将一个固定大小的输入转换为另一个固定大小的输出,这个输出将与寄存器的当前值结合,更新寄存器状态。
    (3)更新寄存器:在每个块处理完后,寄存器的值会被更新,这些值将成为下一块处理的初始值。
  5. 输出
    当所有块都处理完毕后,寄存器中的值就是最终的哈希值。这个值被串接在一起形成最终的哈希输出。
    特殊算法规则
    (1)非线性组合:为了增加算法的复杂度和抵抗攻击,哈希函数通常包含非线性组合,比如使用S盒(S-boxes)或复杂的布尔函数。
    (2)扩散:通过循环左移、异或等操作,确保输入中的每一个比特位都能影响输出中的每一个比特位,这就是所谓的“雪崩效应”。
    (3)混淆:使用常量和随机数生成器来混淆中间状态,使得攻击者难以预测算法的行为。

上述步骤是对哈希算法算法规则的简化描述,实际的算法实现会更为复杂,涉及许多数学和密码学原理。

三、算法实现

以下是Hash算法的Java实现:(因为用JDK8封装SHA-3有点麻烦,所以暂时使用外部库BouncyCastleProvider):

package com.cenho.demo.utils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Arrays;
import java.util.Optional;
public class HashEncryption {
   
    // BC_PROVIDER
    private static final BouncyCastleProvider BC_PROVIDER = new BouncyCastleProvider();

    static {
   
        Security.addProvider(BC_PROVIDER);
    }

    /**
     * 对明文进行摘要计算
     * @param algorithm
     * @param plainText
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static byte[] digest(String algorithm,String plainText) throws NoSuchAlgorithmException{
   
        MessageDigest md= Mes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值