java 常用加密方案总结

时间:2025-08-27 10:48:01来源:互联网

下面小编就为大家分享一篇java 常用加密方案总结,具有很好的参考价值,希望对大家有所帮助。

加密算法分类

不可逆加密:

一旦加密就不能反向解密得到密码原文

md5加密

MD5即Message-Digest Algorithm 5(信息-摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。

 

MD5算法具有以下特点:

  1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。(MD5算法的输出通常以32个十六进制字符的形式表示,每个字符对应4个二进制位。因此,MD5哈希值的字符串表示长度为32。)

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

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

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

 

加密的使用:

import cn.hutool.crypto.SecureUtil;

@Test
public void md5Test(){
    String str = "123456";
    String result = SecureUtil.md5(str);
    System.out.println(result);//e10adc3949ba59abbe56e057f20f883e
}

 

 

SHA1

  安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。

 

SHA1有如下特点:

  1.不可以从消息摘要中复原信息;

  2.两个不同的消息不会产生同样的消息摘要,(但会有1x10 ^ 48分之一的机率出现相同的消息摘要,一般使用时忽略)。

import cn.hutool.crypto.SecureUtil;

@Test
public void sha1Test(){
    String str = "123456";
    String result = SecureUtil.sha1(str);
    System.out.println(result);//7c4a8d09ca3762af61e59520943dc26494f8941b
}

 

HMAC:

全称为“Hash Message Authentication Code”,中文名“散列消息鉴别码”,主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

 

是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

import cn.hutool.crypto.SecureUtil;

@Test
public void hmacTest(){
    String str = "123456";
    String result = SecureUtil.hmacMd5("password").digestHex(str);
    System.out.println(result);//49a15811ea47e8e9c6d8f3ef4d7bbc54
}

 

可逆加密

可逆加密有对称加密和非对称加密。

对称加密:

文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥

对称加密的使用:

数据发信方将明文和加密密钥一起经过特殊的加密算法处理后,使其变成复杂的加密密文发送出去,收信方收到密文后,若想解读出原文,则需要使用加密时用的密钥以及相同加密算法的逆算法对密文进行解密,才能使其回复成可读明文。

 

应用场景:一般用于保存用户手机号、身份证等敏感但能解密的信息。

特点:速度快,适合给大量数据加密

常见的对称加密算法有AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6

DES

数据加密算法(Data Encryption Algorithm,DEA) 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为

  Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运

  算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移

  位操作四种基本运算。

  

  特点:

  1.DES算法具有对称性;(只用一个秘钥串,加密与解密是同一个)

  2.DES的加密和解密可以用完全相同的硬件来实现;

import cn.hutool.crypto.SecureUtil;
	@Test
    public void desTest(){
        String str = "123456";
        String key="password";
        String result = SecureUtil.des(key.getBytes()).encryptHex(str);
        System.out.println(result);//7c80b3d2415b1d57
        String content = SecureUtil.des(key.getBytes()).decryptStr(result);
        System.out.println(content);//123456
    }

 

AES

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

    

特点:

 1.AES在软件及硬件上都能快速地加解密

 2.AES较易于实作,且只需要很少的存储器

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
	@Test
    public void aesTest(){
        String str = "123456";
//      aes对密钥长度有要求,可以是128,192或256位
        byte[] encoded = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        String key = HexUtil.encodeHexStr(encoded);
        System.out.println(key);//9b126b23ad28c0a096c341372fd804f6
        byte[] keyByte = HexUtil.decodeHex(key);
        String result = SecureUtil.aes(keyByte).encryptHex(str);
        System.out.println(result);//ab98b892f13642f0eae768419146c9a9
        String content = SecureUtil.aes(keyByte).decryptStr(result);
        System.out.println(content);//123456
    }

 

非对称加密

简介:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。

 

使用:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。

 

特点:

安全性更好

加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

应用场景:一般用于签名和认证。

常见的非对称加密算法有:RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、El Gamal

RSA

RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

 

RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

 

特点:

  1.安全性较高(目前为止没有有效的破解方法);

  2.公钥与秘钥是成对出现的(用公钥加密必须用私钥才能解密,用私钥加密必须用公钥才能解密)

  3.缺点是运算速度比较慢

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
@Test
public void rsaTest(){
    String str = "123456";
    //生成公私钥对
    KeyPair pair = SecureUtil.generateKeyPair( "RSA");
    PrivateKey privateKey = pair.getPrivate();
    PublicKey publicKey = pair.getPublic();
    //获得私钥
    String privateKeyStr =   HexUtil.encodeHexStr(privateKey.getEncoded());
    System.out.println("私钥:" + privateKeyStr);//30820276020100300d06092a864886f70d0101010500048202603082025c020100028181008d6b568db29be53fb48dbbb10ccee4f99420371416703ddd81012fb37417533fdb4e9cd22b6d9373594efcab4ea9f5d132bdad2b0b0b563d713b1c59a3b2bdfda1dfe1293abffb51f5f318b428d07ae137c8ae5aac2513ea10a89619e5a866337cf40ae78d1083a2b4dabd039f3a6d026826b274379934dcecdd63c5261f1c750203010001028180326006efe8acb1a7d4b81c20c0503eae4cbe81002dd203a790998c955f0824067e276da34c06f75c4276e978584820a14972d96998c08c12ccefe27467e476da8301b2c54b6402ffd39642a41f28a1d1e5e84c374544ddf08f3f4e80a87300d64668cef5acd93b27b852e6011f26f88bb98ac0ca591e14202c85129beb0e5821024100f736d55b9ae32ddbeb04aceb17939e4d3ff6ff1a367746e1cb2b63404ff137da6a84b2ea707e2eb3c74d69c405de6e7e7496304e431041b7a96ea31450963b1d0241009271fa41fe4972eac4cd9bc1da9bac6616ea963e42dc783d2b4afa3343cdbc1fa401c765bd6362f2c5903d10692f581c4ce349632dd96a4c7b44bda1a0c64f39024100e6b04080ef1437e314789473fcd83fcc8e780aad874dded32d281bc213d760eb6ca2cfe27d7f024db919c02cafdd54f6a40cd29ef56de22564f25d33c3cfacf10240577dc4d7fc86012405a419343dd8d7acbe703486ca0751c6a9c0c7ae2d0a13248c258bed5ab2b000fecb67d010277aea9d7d04f13e09309ab4e2a2b0978f22f10240324fd198521b553bf828becca1778fb9152a32ffcc6a10d361a112135a4030d20e67f9abf96424e9029e89c8f69620d5db79f6a35530579c289f64c74be3bc03
    //获得公钥
    String publicKeyStr = HexUtil.encodeHexStr(publicKey.getEncoded());
    System.out.println("公钥:" + publicKeyStr);//30819f300d06092a864886f70d010101050003818d00308189028181008d6b568db29be53fb48dbbb10ccee4f99420371416703ddd81012fb37417533fdb4e9cd22b6d9373594efcab4ea9f5d132bdad2b0b0b563d713b1c59a3b2bdfda1dfe1293abffb51f5f318b428d07ae137c8ae5aac2513ea10a89619e5a866337cf40ae78d1083a2b4dabd039f3a6d026826b274379934dcecdd63c5261f1c750203010001
    RSA rsa = new RSA(privateKeyStr, publicKeyStr);
    //公钥加密,私钥解密
    byte[] encrypt = rsa.encrypt(StrUtil.bytes(str, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
    String encodeStr = HexUtil.encodeHexStr(encrypt);
    System.out.println("公钥加密:" + encodeStr);//580e80ce3ae0acbfb0d46b1345b5957c15c8e8fb1afe8834d83ad652813fb7c16536cbefd911cc1871668e7868b122f80ed1f51a588ea494f67863c75b6461216979f49a5f9910bf91b2d1ffedb860950b1a36ec3cbc75e53fb8cc1796b150ec31f8016c03c590ef4792535265aeac5e0acb8ee1eab7f124eaaf61f799bcbe89
    byte[] decrypt = rsa.decrypt(HexUtil.decodeHex(encodeStr), KeyType.PrivateKey);
    System.out.println("私钥解密:" + new String(decrypt, StandardCharsets.UTF_8));//123456
}

 

 

Base64编码

Base64只是一种编码方式,不算加密方法。

Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,因此编码后输出的文本末尾可能会出现1或2个’=’。

Base64转换后的字符串理论上将要比原来的长1/3。

应用场景:可以对图片文件进行编码传输

import java.util.Base64;

@Test
public void base64Test(){
    String str = "123456";
    byte[] encodedBytes = Base64.getEncoder().encode(str.getBytes(StandardCharsets.UTF_8));
    String base64Content = new String(encodedBytes, StandardCharsets.UTF_8);
    System.out.println(base64Content);//MTIzNDU2
    byte[] contentByte = Base64.getDecoder().decode(base64Content.getBytes(StandardCharsets.UTF_8));
    String content = new String(contentByte, StandardCharsets.UTF_8);
    System.out.println(content);//123456
}

常用应用场景

用户密码

适合使用不可逆加密算法

敏感信息

对称加密、非对称加密、使用对称加密算法对数据进行加密,然后使用非对称加密算法对对称密钥进行加密和传输。

大量数据加密

适合使用对称加密算法

也可以这样:使用非对称加密来对对称加密的秘钥进行加密,用对称加密来对明文进行加密

 

本站部分内容转载自互联网,如果有网站内容侵犯了您的权益,可直接联系我们删除,感谢支持!