当前位置: 首页 > article >正文

安全算法 - 摘要算法

安全算法 - 摘要算法

文章目录

  • 安全算法 - 摘要算法
    • 一:摘要算法概述
    • 二:MD5 摘要算法
    • 三:SHA1摘要算法

一:摘要算法概述

简介

  • 摘要算法属于哈希散列加密算法
  • 消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密
  • 只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文
  • 消息摘要算法主要应用在“数字签名”领域,作为对明文的摘要算法
  • 著名的摘要算法有RSA公司的MD5算法和SHA-1算法及其大量的变体

特点

  • 无论输入的消息有多长,计算出来的消息摘要的长度总是固定

  • 消息摘要看起来是“伪随机的”。也就是说对相同的信息求摘要结果相同

  • 消息轻微改变生成的摘要变化会很大

  • 只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息(单向性)

二:MD5 摘要算法

md5摘要算法具有如下特性

压缩性 : 任意长度的数据,算出的MD5值长度都是固定的(3216进制)。

容易计算 : 从原数据计算出MD5值很容易。

抗修改性 : 对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

强抗碰撞 : 已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的

// java实现MD5加密算法
import java.security.MessageDigest;

public class MD5Demo {
    public static void main(String[] args) {
        System.out.println(getMD5Code("你若安好,便是晴天"));
    }

    // md5加密
    public static String getMD5Code(String message) {
        String md5Str = "";
        try {
            //创建MD5算法消息摘要
            MessageDigest md = MessageDigest.getInstance("MD5");
            //生成的哈希值的字节数组
            byte[] md5Bytes = md.digest(message.getBytes());
            // 转换成为16进制
            md5Str = bytes2Hex(md5Bytes);
        }catch(Exception e) {
            e.printStackTrace();
        }
        return md5Str;
    }

    // 2进制转16进制
    public static String bytes2Hex(byte[] bytes) {
        StringBuffer result = new StringBuffer();
        int temp;
        try {
            for (int i = 0; i < bytes.length; i++) {
                temp = bytes[i];
                if(temp < 0) {
                    temp += 256;
                }
                if (temp < 16) {
                    result.append("0");
                }
                result.append(Integer.toHexString(temp));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result.toString();
    }
}

三:SHA1摘要算法

对于长度小于2^64位的消息,SHA1会产生一个160位(40个字符)的消息摘要。

当接收到消息的时候,这个消息摘要可以用来验证数据的完整性

在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要

SHA1有如下特性:

  • 不可以从消息摘要中复原信息(不可逆性)
  • 两个不同的消息不会产生同样的消息摘要,(但会有1x1048分之一的机率出现相同的消息摘要,一般使用时忽略)
// java实现SHA1算法
package com.snailclimb.ks.securityAlgorithm;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA1Demo {

    public static void main(String[] args) {
        System.out.println(getSha1("你若安好,便是晴天"));

    }

    public static String getSha1(String str) {
        if (null == str || 0 == str.length()) {
            return null;
        }
        char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            //创建SHA1算法消息摘要对象
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
            //使用指定的字节数组更新摘要。
            mdTemp.update(str.getBytes("UTF-8"));
            //生成的哈希值的字节数组
            byte[] md = mdTemp.digest();
            //SHA1算法生成信息摘要关键过程
            int j = md.length;
            char[] buf = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(buf);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "0";

    }
}

http://www.kler.cn/a/510330.html

相关文章:

  • 【2024年华为OD机试】(C卷,100分)- 悄悄话 (Java JS PythonC/C++)
  • 【大数据2025】Yarn 总结
  • 通信协议之多摩川编码器协议
  • Web前端------表单标签
  • 力扣解题汇总(简单)_JAVA
  • 基于Python+Gurobi的库存分配问题建模求解
  • 一种基于部分欺骗音频检测的基于临时深度伪造位置方法的高效嵌入
  • Python语言的计算机基础
  • 【Android】蓝牙电话HFP连接源码分析
  • Debian没有reboot命令记录
  • 【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验
  • 【深入解析】 RNN 算法:原理、应用与实现
  • MPSOC 裸机测试USB3.0接口
  • boss直聘 验证码 手图 分析
  • git系列之revert回滚
  • 使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发
  • 几个Linux系统安装体验(续): 中标麒麟服务器系统
  • node.js卸载与安装超详细教程
  • 好用的输大文件的软件推荐!
  • 【博客之星】2024年度个人成长、强化学习算法领域总结
  • 解决 Mac 系统上的 node-sass 问题
  • Redis的安装和使用--Windows系统
  • 开发规范
  • java springboot项目使用easypackage一键打包windows服务
  • SpringBoot多级配置文件
  • 五.指派问题(变异问题)