• 常用的数字签名,信息加密算法


    数字签名,信息加密是前后端开发经常使用的技术。应用场景包括:用户登录,交易,信息通讯等。

    MD5

    • MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。
    • MD5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
    • 将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。

    MD5算法具有以下特点:
    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
    5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
    MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

    SHA

    • SHA全称是Secure Hash Algorithm,安全散列算法
    • 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
    • 对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。
    • 该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
    • 散列函数值可以说是对明文的一种"指纹"或是"摘要",所以对散列值的数字签名就可以视为对此明文的数字签名。

    MD5和SHA区别

    因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同
    1.对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
    2.对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
    3.速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

    MD5和SHA1的应用场景

    MD5和SHA1的信息摘要及不可逆的特性

    • 密码验证:服务器端存储用户密码加密后的内容,每次密码校验比较的是密文是否相同,确保服务器管理员也无法获取到用户使用的密码。
    • 文件的完整性比较:当下载一个文件时,服务器返回的信息中包括这个文件的MD5(或者SHA1),在本地下载完毕将其进行MD5加密,之后比较两个MD5只进行比较,如果一直则说明文件完整不存在丢包现象。
    • 文件上传:在上传文件信息的时候,将该文件的MD5同时上传给服务器。服务器中存储了这个文件MD5,并存储这个MD5只对应的已上传的字节长度,比如未上传为0,已完成为-1,已上传200自己,则值为200。可以用于匹配该文件在服务器中的状态,方便断点再传。只要源文件没有改,就算文件改了名字,换个账户都可以在服务器中找到对应的文件,避免存储多份相同文件,并可以提高二次上传时的速度。
    • 版权验证:当一个视频或者音创作出来的时候他的MD5是唯一的,翻录过后的版本的MD5会不同,可以用于版权验证。

    数字签名

    • 数字签名,简单来说就是通过提供可鉴别的数字信息, 验证自身身份的一种方式。
    • 一套数字签名,通常定义两种互补的运算,一个用于签名,另一个用于验证。
    • 分别由发送者持有能够代表自己的私钥,由接受者持有的与私钥对应的公钥,能够在接受到来自发送者信息时候用于验证其身份。

    加密

    数据加密 基本过程,就是对来的明文的文件或者数据 按照 某种算法 进行处理,使其成为不可读的一段代码,通常成为 “密文”。通过这样的途径,来达到保护数据 不被别人 非法窃取,阅读的目的。

    解密

    加密的逆过程为解密,将 编码的信息 转为为 原有的数据 的过程。

    对称加密和非对称加密

    常见的对称加密算法:DES,3DES,AES等
    常见的非对称加密算法:RSA,DSA等

    对称加密(共享密钥加密算法)

    在对称加密算法中,使用的密钥只有一个,发送者 和 接受者 双方都是用这一个密钥进行 加密 和 解密。这就要求通信双方都必须事先知道这个密钥。

    非对称加密算法(公开密钥加密算法)

    在非对称加密算法中,她需要两个密钥,一个称为公开密钥,另一个为私有密钥。因为加密和解密使用的密钥不同,所以称为非对称加密算法。

    如果使用公钥对数据进行加密,只有用对应的私钥才可以对其进行解密。
    如果使用私钥对数据进行加密,只有用对应的公钥才可以对其进行解密。
    
    • 1
    • 2

    代码实现

    md5,sha1摘要算法

    import cn.hutool.crypto.SecureUtil;
    	private static void md5(){
            String s = "我是中国人";
            System.out.println(SecureUtil.md5(s));
        }
    
       private static void sha1(){
           String s = "我是中国人";
           System.out.println(SecureUtil.sha1(s));
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    rsa非对称算法

    import cn.hutool.crypto.SecureUtil;
    import cn.hutool.crypto.asymmetric.KeyType;
    import org.apache.commons.codec.binary.Base64;
    
    import java.security.KeyPair;
    
    public class RSAUtil {
        private static final String publicKey;
        private static final String privateKey;
    
        static {
            KeyPair pair = SecureUtil.generateKeyPair("RSA");
            publicKey = new String(Base64.encodeBase64(pair.getPublic().getEncoded()));
            privateKey= new String(Base64.encodeBase64((pair.getPrivate().getEncoded())));
        }
    
        public static String encrypt(String str){
            return SecureUtil.rsa(privateKey,publicKey).encryptBcd(str, KeyType.PrivateKey);
        }
    
        public static String decrypt(String str){
            return SecureUtil.rsa((String) null,publicKey).decryptStrFromBcd(str, KeyType.PublicKey);
        }
    
    
        public static void main(String[] args) {
            System.out.println("publicKey:"+publicKey);
            System.out.println("privateKey:"+privateKey);
    
            String encryptStr = encrypt("{\"info\":\"admin\"}");
            System.out.println(encryptStr);
            System.out.println(decrypt(encryptStr));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    杭州亚运会,一个中国TO B厂商的“新样板间”
    《深入理解Java虚拟机》——Java内存区域与内存溢出异常
    java 数据结构 优先级队列(PriorityQueue)
    Go语言学习笔记——正则表达式
    鸿蒙API9+axios封装一个通用工具类
    详解自监督发展趋势! 何恺明连获三年CVPR最高引用的秘诀是?
    南怀瑾:“心静出贵人”,中年后这三个地方静,一切都会越来越顺!
    HCIA-MSTP替代技术之链路捆绑(LACP模式)
    递归经典例题 --- 汉诺塔(图文详解)
    基于springboot实现医院信管系统项目【项目源码+论文说明】
  • 原文地址:https://blog.csdn.net/m0_51527921/article/details/126764228