两种常用的哈希算法与Hmac算法

目录

0.概述:

1、MD5算法

1.1 步骤

1.2代码实现

2 、SHA-1算法

2.1 步骤

2.2 代码实现:

3 、Hmac算法

3.1 步骤:

3.2 代码实现:


0.概述:

哈希算法又称摘要算法,它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。哈希算法的目的:为了验证原始数据是否被篡改。

最主要的特点是:

  • 相同的输入一定得到相同的输出

  • 不同的输入大概率得到不同的输出

1、MD5算法

1.1 步骤

  • 获取基于MD5加密算法的工具对象

  • 更新原始数据

  • 获取加密后的结果

  • 将字节数组形式的结果转换成字符串

1.2代码实现

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
​
/*
 * MD5加密密码,规定长度为32,并且拿到他的字符串形式
 */
public class Test02 {
    public static void main(String[] args) {
        String password = "wbjxxmynhmyzgq";
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(password.getBytes());
            byte[] digestByteArray = digest.digest();//加密
            StringBuilder result = new StringBuilder();
            for(byte b : digestByteArray) {
                result.append(String.format("%02x", b));
            }
            System.out.println(result.toString());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

2 、SHA-1算法

2.1 步骤

  • 获取基于MD5加密算法的工具对象(“SHA-1”)

  • 更新原始数据

  • 获取加密后的结果

  • 将字节数组形式的结果转换成字符串

2.2 代码实现:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.UUID;
/*
 * SHA-1哈希算法
 */
public class Test01 {
    public static void main(String[] args) {
        String password = "sdfsdf";
        //加盐
        String salt = UUID.randomUUID().toString().substring(0, 5);
        System.out.println(salt);
        try {
            //SHA-1哈希算法
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(password.getBytes());
            digest.update(salt.getBytes());
            byte[] digestArray = digest.digest();
            StringBuilder resultStr = new StringBuilder();
            for(byte b : digestArray){
                resultStr.append(String.format("%02x", b));
            }
            System.out.println(resultStr.toString());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

3 、Hmac算法

3.1 步骤:

  • 生成秘钥(创建秘钥生成器对象)

  • 利用秘钥生成器生成秘钥

  • 生成秘钥Key的字节数组

  • 可以将秘钥字节数组转换成字符串

  • 使用秘钥、进行加密(获取算法对象)

  • 初始化

  • 更新原始内容

  • 加密,生成字节数组形式的加密结果

  • 将加密结果转换成字符串

3.2 代码实现:

public class Test01 {
    public static void main(String[] args) {
        try{
        //1 获取秘钥结果
        String password = "nhmyzgq";
        //秘钥生成器
      KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
        //生成秘钥
        SecretKey key = keyGen.generateKey();
        //生成秘钥数组
        byte[] keyByteArray = key.getEncoded();
        StringBuilder sb = StringBuilder();
        for(byte b:keyByteArray) {
            sb.append(String.format("%02x", b));
        }
        System.out.println("打印秘钥内容:" + sb);
         //2使用秘钥,进行加密
        //获取算法对象
        Mac mac = Mac.getInstance("HmacMD5");
        //初始化
        mac.init(key);
        mac.update(password.getBytes());
        //加密(返回字节数组)
        byte[] resultByteArray = mac.doFinal();
        //把字节数组转换成字符串
        StringBuilder resultStr = new StringBuilder();
        for(byte b : resultByteArray){
            resultStr.append(String.format("%02", b));
        }
        System.out.println(resultStr);
    }catch(NoSuchAlgorithmException e){
            e.printStackTrace();
     }
    }
}
恢复秘钥的代码实现:
public class Test01 {
    public static void main(String[] args) {
        try{
        //1 获取秘钥结果
        String password = "nhmyzgq";
        //秘钥生成器
      KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
        //生成秘钥
        SecretKey key = keyGen.generateKey();
        //生成秘钥数组
        byte[] keyByteArray = key.getEncoded();
        StringBuilder sb = StringBuilder();
        for(byte b:keyByteArray) {
            sb.append(String.format("%02x", b));
        }
        System.out.println("打印秘钥内容:" + sb);
         //2使用秘钥,进行加密
        //获取算法对象
        Mac mac = Mac.getInstance("HmacMD5");
        //初始化
        mac.init(key);
        mac.update(password.getBytes());
        //加密(返回字节数组)
        byte[] resultByteArray = mac.doFinal();
        //把字节数组转换成字符串
        StringBuilder resultStr = new StringBuilder();
        for(byte b : resultByteArray){
            resultStr.append(String.format("%02", b));
        }
        System.out.println(resultStr);
    }catch(NoSuchAlgorithmException e){
            e.printStackTrace();
     }
    }
}

  • 21
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
鹏哥哥加密算法 如果对您有所帮助 请点进下面GitHub链接 送一颗宝贵的星星给我 // GitHub地址 https://github.com/penghero/PGGCrypto.git 超全的加密算法锦集 每个算法都进行了封装 都可以通过类方法直接进行创建使用 而且各个类方法中都有详细的说明 使用时请仔细查看 1、AES加密(对称加密算法) AES加密(对称加密) 优点:简单、可并行计算、误差不传递 缺点:不能隐藏明文模式(比如图像加密轮廓仍在)、主动攻击(改明文,后续内容不影响,只要误差不传递该缺点就存在) 用途:需要并行加密的应用 AES加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。设计为支持128/192/256位(/32=nb)数据块大小(即分组长度);支持128/192/256位(/32=nk)密码长度,,在10进制里,对应34×1038、62×1057、1.1×1077个密钥 2、DES加密(对称加密解密) 3、RSA加密 (非对称加密) 包括.der和.p12文件加密解密,和公钥私钥字符串加密解密 特点 RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于加密和数宇签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 4、MD5加密 MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。 全写: Message Digest Algorithm MD5(中文名为消息摘要算法第五版) 输出: 128bit 特点: 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 2、容易计算:从原数据计算出MD5值很容易。 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。 4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。 5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。 缺陷:Md5一度被认为十分靠谱。2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。2009年,冯登国、谢涛二人利用差分攻击,将MD5的碰撞算法复杂度从王小云的2^42进一步降低到2^21,极端情况下甚至可以降低至2^10。仅仅2^21的复杂度意味着即便是在2008年的计算机上,也只要几秒便可以找到一对碰撞。Md5已老, 在安全性要求较高的场合,不建议使用。 5、sha1加密(安全[哈希算法])只是叫做一种算法,用于检验数据完整性 全名: 安全哈希算法(Secure Hash Algorithm)输出: 160bit 与Md5比较 相同点: 因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似。 不同点: 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。 6、 HMAC加密消息摘要算法 我们通常在遇到的时候会看到“HMAC”字眼,mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。 7、HMACMD5加密
HMAC算法和循环冗余算法(CRC)是两种完全不同的算法,用于不同的目的。下面分别介绍一下它们的特点和用途。 HMAC算法 HMACHash-based Message Authentication Code)算法是一种基于哈希函数的消息认证码算法。它通过将密钥和消息作为输入,生成一个固定长度的认证码,用于验证消息的完整性和真实性。 HMAC算法的主要特点包括: 1. 基于哈希函数,具有高度安全性和不可逆性。 2. 通过引入密钥,增强了消息的安全性,避免了被篡改或伪造的风险。 3. 可以用于验证消息的完整性和真实性,以及识别伪造或篡改的消息。 HMAC算法广泛应用于网络安全领域,例如SSL、IPsec、SSH等协议中,用于保护通信过程中的数据安全和完整性。 循环冗余算法(CRC) 循环冗余算法(CRC)是一种根据数据位的内容生成校验码的算法。它通过将数据按位进行异或运算,生成一个固定长度的校验码,用于检测数据传输过程中的错误。 CRC算法的主要特点包括: 1. 可以检测出单比特差错、双比特差错、奇偶差错等多种错误。 2. 通过生成一个固定长度的校验码,可以在传输数据时快速检测数据的完整性,提高数据传输的可靠性。 3. 由于CRC算法的计算速度较快,因此被广泛应用于计算机网络、数据存储等领域。 总体来说,HMAC算法和CRC算法都是常见的数据安全算法,用于不同的领域和目的。HMAC算法主要用于验证消息的完整性和真实性,而CRC算法主要用于检测数据传输过程中的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值