Java消息摘要:SHA验证数据完整性、密码的加密

news2024/10/22 10:02:07

1、SHA 算法家族

SHA(Secure Hash Algorithm,安全散列算法)是一个密码散列函数家族,被美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布为联邦数据处理标准(FIPS)。SHA 算法是基于 MD4 算法实现的,作为 MD 算法的继任者,成为新一代的消息摘要算法的代表。SHA 与 MD 算法不同之处主要在于摘要长度,SHA 算法可以生成一个被称为消息摘要的160位(20字节)散列值,而 MD5 的固定长度为128位(16字节)。

SHA-1 是 SHA 算法家族中的第一个成员,于1995年发布。尽管 SHA-1 的设计相当出色,但近年来密码学家已找到其弱点,并证明可以找到两个不同的消息,它们会产生相同的 SHA-1 散列值,即 SHA-1 存在碰撞(collision)的可能性。因此,SHA-1 的安全性被认为已经不足以用于保护敏感信息,许多组织已经建议或要求使用更强的散列算法,如 SHA-2 或 SHA-3。

SHA-2 是 SHA 算法家族的第二代,包括 SHA-224、SHA-256、SHA-384、SHA-512 以及基于这些的 HMAC、HMAC-based Extract-and-Expand(HMAC-SHA-256/512等)变种。SHA-2 算法家族在 SHA-1 的基础上进行了改进,提供了更高的安全性。

SHA-3 是 SHA 算法家族的最新成员,于 2015 年正式发布。SHA-3 的设计目标是提供一个与 SHA-2 完全不同的散列函数,以增加对量子计算机攻击的抵抗力。SHA-3 算法家族包括 SHA3-224、SHA3-256、SHA3-384 和 SHA3-512 等。

总的来说,SHA 算法家族在密码学中扮演着重要的角色,为数据的完整性验证提供了有力的工具。然而,随着技术的发展和攻击手段的不断更新,选择和使用合适的SHA算法版本对于确保数据的安全性至关重要。

2、使用 SHA 消息摘要

消息摘要是密码学中的一个重要概念,它能够将任意长度的数据转换为固定长度的摘要值,这个摘要值通常是一个较短的字符串。消息摘要算法,也被称作散列算法,是一种单向加密算法,具有不可逆性,即无法从摘要值恢复出原始数据。

消息摘要的特点:

  1. 固定长度:无论输入的消息有多长,计算出来的消息摘要的长度总是固定的,如SHA的固定长度为160位(20字节)。
  2. 唯一性:只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。
  3. 不可逆性:消息摘要是单向的,无法从摘要值恢复出原始数据。
  4. 快速计算:消息摘要算法通常能够快速地计算出摘要值,适用于大数据量的处理。

【实例】使用 SHA 算法,生成消息摘要。

(1)创建 SHAUtil 类(SHA消息摘要工具类)。

package com.pjb.util;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

/**
 * SHA 消息摘要工具类
 * @author pan_junbiao
 **/
public class SHAUtil
{
    //字符编码
    private final static String charsetName = StandardCharsets.UTF_8.name();

    /**
     * SHA-256 消息摘要
     */
    public static String encodeSHA256(String data)
    {
        String result = null;
        try
        {
            //算法
            String algorithm = "SHA-256"; //SHA家族:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512

            //创建消息摘要对象
            MessageDigest messageDigest = MessageDigest.getInstance(algorithm);

            //执行消息摘要算法
            byte[] digestBytes = messageDigest.digest(data.getBytes(charsetName));

            //将指定byte数组转换成16进制字符串,否则输出的结果是一串乱码
            result = byteToHexString(digestBytes);
        } catch (Exception ex)
        {
            ex.printStackTrace();
        }
        return result;
    }

    /**
     * 将指定byte数组转换成16进制字符串
     */
    private static String byteToHexString(byte[] b)
    {
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < b.length; i++)
        {
            //把密文转换成16进制
            String hex = Integer.toHexString(b[i] & 0xFF);
            //如果密文的长度只有1位,则需要再高位进行补0
            if (hex.length() == 1)
            {
                hex = '0' + hex;
            }
            //拼接字符与转大写字母
            hexString.append(hex.toUpperCase());
        }
        return hexString.toString();
    }
}

(2)使用 SHA-256 算法,生成消息摘要。

/**
 * SHA-256 消息摘要
 */
@Test
public void testSHA256()
{
    String data = "您好,欢迎访问 pan_junbiao的博客";
    String encodeSHA256 = SHAUtil.encodeSHA256(data);

    //打印结果
    System.out.println("原始数据:" + data);
    System.out.println("SHA256消息摘要:" + encodeSHA256);
}

 执行结果:

2、密码的加密

实际开发应用中,存储用户密码时,通常不会存储明文密码,而是存储密码的 MD5 或 SHA 值。在身份验证过程中,用户通常不会直接发送密码,而是发送密码的摘要值。服务器通过相同的摘要算法计算出的摘要值与数据库中存储的摘要值进行比对,从而验证用户身份。这种方法即使在数据被截获的情况下,也能够保护密码的安全。

【实例】使用 SHA-256 算法,实现密码的加密。

/**
 * 使用 SHA-256 进行密码的加密
 */
@Test
public void createPasswordSHA256()
{
    String password = "123456"; //原始密码
    String salt = "ABCDEFG";    //盐

    //使用 SHA-256 算法,加密密码(密码格式:原始密码 + 盐)
    String passwordSHA = SHAUtil.encodeSHA256(password + salt);

    //打印结果
    System.out.println("原始密码:" + password);
    System.out.println("SHA256密码加密:" + passwordSHA);
}

 执行结果:

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

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

相关文章

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器&#xff0c;实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件&#xff0c;主要包括&a…

sql server 行转列及列转行

图1 图2 1.行转列 &#xff08;图1->图2&#xff09; 1.方法一 (数据库通用&#xff09;&#xff0c;使用max 加case when 函数 -- 行转列 图1->图2 SELECT name,MAX(CASE WHEN subject语文 THEN score ELSE 0 END) AS "语文",MAX(CASE WHEN subject数学 …

OpenSEMBA :一个用于电磁场模拟的开源软件框架

OpenSEMBA 是一个用于电磁场模拟的开源软件框架&#xff0c;主要针对时域有限差分法&#xff08;FDTD&#xff09;和其他数值方法。以下是 OpenSEMBA 的主要特点、功能和应用领域的详细介绍&#xff1a; 主要特点 开源平台 &#xff1a; OpenSEMBA 是一个开源项目&#xff0…

2025全网最全计算机毕业设计选题推荐:计算机毕设选题指导及避坑指南√

博主介绍&#xff1a;✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…

处理文件上传和进度条的显示(进度条随文件上传进度值变化)

成品效果图&#xff1a; 解决问题&#xff1a;上传文件过大时&#xff0c;等待时间过长&#xff0c;但是进度条却不会动&#xff0c;只会在上传完成之后才会显示上传完成 上传文件的upload.component.html <nz-modal [(nzVisible)]"isVisible" [nzTitle]"文…

跨浏览器免费书签管理系统

随着互联网信息的爆炸式增长&#xff0c;如何有效管理我们日常浏览中发现的重要网页&#xff0c;成为了每个重度互联网用户的需求。一个跨平台的书签管理网站能够帮助用户在不同设备之间无缝同步和管理书签。本文将分享如何使用 Python 和 SQLite 构建一个简单、易于维护的跨平…

MySQL数据库操作——(4)

目录 8 视图 8.1 常见的数据库对象 8.2 视图概述 8.2.1 为什么使用视图&#xff1f; 8.2.2 视图的理解 8.3 创建视图 8.3.1 创建单表视图 8.3.2 创建多表联合视图 8.3.3 基于视图创建视图 8.4 查看视图 8.5 更新视图的数据 8.5.1 一般情况 8.6 修改、删除视图 8.…

基于SpringBoot+Vue景区酒店点评系统【提供源码+答辩PPT+参考文档+项目部署】

&#x1f4a5; 这两年毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的JavaWeb项目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff01; ❗如何解决这类问题&#xff1f; 让我们能够顺利通过毕业&#xff0c;我也一直在不断思考、努力、精进。通过2024年…

计算机网络基本命令

实验内容&#xff1a; 1. **ipconfig命令** - **用途**&#xff1a;显示和配置TCP/IP网络设置。 - **常用选项**&#xff1a; - ipconfig&#xff1a;显示所有网络适配器的IP地址、子网掩码、默认网关等信息。 - ipconfig /all&#xff1a;显示所有网络适配器…

汽车预约维修系统ssm+论文源码调试讲解

2相关技术 2.1微信小程序 小程序是一种新的开放能力&#xff0c;开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播&#xff0c;同时具有出色的使用体验。尤其拥抱微信生态圈&#xff0c;让微信小程序更加的如虎添翼&#xff0c;发展迅猛。 2.2 MYSQL数据…

Redis在实践的关键点

Redis键值设计 优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符例如:我们的登录业务,保存用户信息,其key可以设计成如下格式: 这样设计的好处: 可读性强避免key冲突…

通过比较list与vector在简单模拟实现时的不同进一步理解STL的底层

cplusplus.com/reference/list/list/?kwlist 当我们大致阅读完list的cplusplus网站的文档时&#xff0c;我们会发现它提供的接口大致上与我们的vector相同。当然的&#xff0c;在常用接口的简单实现上它们也大体相同&#xff0c;但是它们的构造函数与迭代器的实现却大有不同。…

YOLOv11[基础]】热力图可视化实践① | 视频版 | 输入为视频文件

目录 一 热力图 二 安装YOLOv11 三 实践 一 热力图 使用Ultralytics YOLO11生成的热图将复杂的数据转换为充满活力的彩色编码矩阵。这个可视化工具使用一系列颜色来表示不同的数据值,其中较暖的色调表示较高的强度

探索 SVG 创作新维度:svgwrite 库揭秘

文章目录 **探索 SVG 创作新维度&#xff1a;svgwrite 库揭秘**背景介绍库简介安装指南基础函数使用实战场景常见问题与解决方案总结 探索 SVG 创作新维度&#xff1a;svgwrite 库揭秘 背景介绍 在数字艺术和网页设计领域&#xff0c;SVG&#xff08;Scalable Vector Graphic…

如何有效维护您的WordPress在线商店内容:提高客户参与度与转化率的实用技巧

在电子商务领域&#xff0c;内容为王。新鲜、相关且有吸引力的内容能显著提升客户参与度和转化率。本文将探讨如何有效更新和维护您的在线商店内容&#xff0c;确保客户始终获得最佳体验。 定期更新产品信息 产品描述 产品描述是吸引客户和促成销售的关键。定期检查并更新产…

PyCharm借助MobaXterm跳板机连接服务器

服务器信息&#xff1a; Step 1 MovaXterm→Session→SSH输入服务器信息 Step 2 MovaXterm→Session→SSH→Network setting→SSG gateway(jump host) 输入跳板机信息 键入密码即可 Step 3 MovaXterm→Tunneling→New SSH tunnel 依次输入&#xff1a;A本机端口&#xff0c…

基于RBF神经网络的双参数自适应光储VSG构网逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 此模型源侧部分采用光伏发电系统与混合储能系统&#xff08;蓄电池超级电容&#xff09;&#xff0c;并网逆变器采用虚拟同步发电机&#xff08;VSG&#xff09;控制&#xff0c;为系统提供惯量阻尼…

Numpy基础01

目录 1.array创建对象 1.1定义一维数组 1.2定义二维数组 2.Numpy的数据类型 3.数据类型标识码 4.array的API 4.1astype() 4.2max() 4.3min() 4.4sum() 4.5reshape() 4.6random.rand() 5.数组属性 5.1ndim 5.2shape 5.3itemsize 5.4flags 6.创建数组方法 6.1a…

VScode远程服务器之远程容器进行开发(四)

VScode远程服务器之远程容器进行开发(四) Remote-Containers 可以让vscode使用docker中的容器环境进行开发和debug。 1. 使用一个运行中的容器进行开发 - Attach to running container 如果正好有一个正在运行的容器。可能是正在运行的服务,或者是预先build好的开发镜像…

2024.10.9华为留学生笔试题解

第一题无线基站名字相似度 动态规划 考虑用动态规划解决 char1=input().strip() char2=input().strip() n,m=len(char1),len(char2) dp=[[0]*(m+1) for _ in range(n+1)] #dp[i][j]定义为以i-1为结尾的char1 和以 j-1为结尾的char2 的最短编辑距离 setA = set(wirel@com) set…