【加密算法】5 种常见的摘要、加密算法

article/2025/9/27 17:12:13

大家平时的工作中,可能也在很多地方用到了加密、解密,比如:

  1. 用户的密码不能明文存储,要存储加密后的密文
  2. 用户的银行卡号、身份证号之类的敏感数据,需要加密传输
  3. 还有一些重要接口,比如支付,客户端要对请求生成一个签名,服务端要对签名进行验证
  4. ……

那么上面提到的这些能力,我们都可以利用哪些加密算法来实现呢?咱们接着往下看。

加密算法整体上可以分为:不可逆加密、可逆加密。可逆加密又可以分为:对称加密、非对称加密。
在这里插入图片描述

1.不可逆算法

不可逆加密的算法的加密是不可逆的,密文无法被还原成原文。

散列算法,就是一种不可逆算法。散列算法中,明文通过散列算法生成散列值,散列值是长度固定的数据,和明文长度无关;常用于数字签名、消息认证、密码存储等场景;不需要密钥的,当然也有一些不可逆算法,需要密钥,例如 HMAC 算法。

散列算法的具体实现有很多种,常见的包括 MD5SHA1SHA-224SHA-256 等等。

1.1 MD5

MD5,全称为 “Message-Digest Algorithm 5”,翻译过来叫“信息摘要算法”。它可以将任意长度的数据通过散列算法,生成一个固定长度的散列值。MD5算法的输出长度为 128 位,通常用 32 个 16 进制数表示

public class Md5Util {private static final String[] hexDigits = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};/*** 获取MD5加密结果** @param plainText   要加密的原字符串* @param uppercase   是否转为大写字符串* @param bit         加密结果位数(16,32),默认是32* @return 返回加密结果*/public static String encrypt(String plainText, boolean uppercase, Integer bit) {byte[] btInput = plainText.getBytes(StandardCharsets.UTF_8);MessageDigest messageDigest;try {//获得MD5摘要对象messageDigest = MessageDigest.getInstance("MD5");//使用指定的字节数组更新摘要信息messageDigest.update(btInput);} catch (NoSuchAlgorithmException e) {throw new RuntimeException("MD5签名过程中出现错误,算法异常");}byte[] digest = messageDigest.digest();//字节数组转成16进制字符串String result = byteArrayToHexString(digest);//如果获取的是16位加密结果的,则截取原加密结果(32位)中间的16位,也就是8-24位if (bit != null && bit == 16) {//截取下标从0开始result = result.substring(8, 24);}//结果的大小写处理return uppercase ? result.toUpperCase() : result;}/*** 字节数组转成16进制字符串** @author zzc* @date 2023/6/28 17:29* @param bytes* @return java.lang.String*/private static String byteArrayToHexString(byte[] bytes) {StringBuilder builder = new StringBuilder();for (byte b : bytes) {builder.append(byteToHexString(b));}return builder.toString();}/*** 字节转成16进制字符** @author zzc* @date 2023/6/28 17:29* @param b* @return java.lang.String*/private static String byteToHexString(byte b) {int n = b;if (n < 0) {n = 256 + n;}int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}public static void main(String[] args) throws Exception {String s = "zzc";System.out.println(encrypt(s, false, 32));}}
  • 优点:算速度快、输出长度固定、应用广泛
  • 缺点:不安全。

MD5算法已经被攻破,而且 MD5 算法的输出长度有限,攻击者可以通过暴力破解或彩虹表攻击等方式,找到与原始数据相同的散列值,从而破解数据。虽然可以通过加盐,也就是对在原文里再加上一些不固定的字符串来缓解,但是完全可以用更安全的 SHA 系列算法替代

1.2 SHA-256

SHA(Secure Hash Algorithm)系列算法是一组密码散列函数,用于将任意长度的数据映射为固定长度的散列值。SHA系列算法由美国国家安全局(NSA)于1993年设计,目前共有 SHA-1SHA-2SHA-3 三种版本。其中 SHA-1 系列存在缺陷,已经不再被推荐使用。

SHA-2 算法包括 SHA-224、SHA-256、SHA-384 和 SHA-512 四种散列函数,分别将任意长度的数据映射为 224 位、256 位、384 位和 512 位的散列值。

public class SHA256Util {public static String getSHA256String(String str) {MessageDigest messageDigest;String sha256Str = "";try {messageDigest = MessageDigest.getInstance("SHA-256");messageDigest.update(str.getBytes("UTF-8"));sha256Str = byte2Hex(messageDigest.digest());} catch (Exception e) {e.printStackTrace();}return sha256Str;}/*** 将byte转为16进制** @param bytes* @return*/private static String byte2Hex(byte[] bytes) {StringBuffer stringBuffer = new StringBuffer();String temp = null;for (int i = 0; i < bytes.length; i++) {temp = Integer.toHexString(bytes[i] & 0xFF);if (temp.length() == 1) {stringBuffer.append("0");}stringBuffer.append(temp);}return stringBuffer.toString();}public static void main(String[] args) throws Exception {String data = "Hello World";String encryptedData = getSHA256String(data);System.out.println("加密后的数据:" + encryptedData);}}

SHA-2 算法之所以比 MD5 强,主要有两个原因:

  1. 散列值长度更长:例如 SHA-256 算法的散列值长度为 256 位,而 MD5 算法的散列值长度为 128 位,这就提高了攻击者暴力破解或者彩虹表攻击的难度。
  2. 更强的碰撞抗性:SHA 算法采用了更复杂的运算过程和更多的轮次,使得攻击者更难以通过预计算或巧合找到碰撞。
    当然,SHA-2 也不是绝对安全的,散列算法都有被暴力破解或者彩虹表攻击的风险,所以,在实际的应用中,加盐还是必不可少的

2.可逆算法

2.1 对称加密

对称加密算法使用同一个密钥进行加密和解密。加密和解密过程使用的是相同的密钥,因此密钥的安全性至关重要。如果密钥泄露,攻击者可以轻易地破解加密数据。

常见的对称加密算法包括 DES、3DES、AES 等。其中,AES 算法是目前使用最广泛的对称加密算法之一,具有比较高的安全性和加密效率

2.1.1 DES

DES(Data Encryption Standard)算法是一种对称加密算法,由IBM公司于1975年研发,是最早的一种广泛应用的对称加密算法之一。

DES 算法使用 56 位密钥对数据进行加密,加密过程中使用了置换、替换、异或等运算,具有较高的安全性

public class DES {private static final String DES_ALGORITHM = "DES";/*** DES加密** @param data 待加密的数据* @param key  密钥,长度必须为8位* @return 加密后的数据,使用Base64编码*/public static String encrypt(String data, String key) throws Exception {// 根据密钥生成密钥规范KeySpec keySpec = new DESKeySpec(key.getBytes());// 根据密钥规范生成密钥工厂SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);// 根据密钥工厂和密钥规范生成密钥SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);// 根据加密算法获取加密器Cipher cipher = Cipher.getInstance(DES_ALGORITHM);// 初始化加密器,设置加密模式和密钥cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 加密数据byte[] encryptedData = cipher.doFinal(data.getBytes());// 对加密后的数据进行Base64编码return Base64.getEncoder().encodeToString(encryptedData);}/*** DES解密** @param encryptedData 加密后的数据,使用Base64编码* @param key           密钥,长度必须为8位* @return 解密后的数据*/public static String decrypt(String encryptedData, String key) throws Exception {// 根据密钥生成密钥规范KeySpec keySpec = new DESKeySpec(key.getBytes());// 根据密钥规范生成密钥工厂SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);// 根据密钥工厂和密钥规范生成密钥SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);// 对加密后的数据进行Base64解码byte[] decodedData = Base64.getDecoder().decode(encryptedData);// 根据加密算法获取解密器Cipher cipher = Cipher.getInstance(DES_ALGORITHM);// 初始化解密器,设置解密模式和密钥cipher.init(Cipher.DECRYPT_MODE, secretKey);// 解密数据byte[] decryptedData = cipher.doFinal(decodedData);// 将解密后的数据转换为字符串return new String(decryptedData);}public static void main(String[] args) throws Exception {String data = "Hello World";String key = "12345678";String encryptedData = encrypt(data, key);System.out.println("加密后的数据:" + encryptedData);String decryptedData = decrypt(encryptedData, key);System.out.println("解密后的数据:" + decryptedData);}
}

DES 的算法速度较快,但是在安全性上面并不是最优选择,因为DES算法的密钥长度比较短,被暴力破解和差分攻击的风险比较高,一般推荐用一些更安全的对称加密算法,比如 3DES、AES

2.1.2 AES

AES(Advanced Encryption Standard)即高级加密标准,是一种对称加密算法,被广泛应用于数据加密和保护领域。AES 算法使用的密钥长度为 128 位、192 位或 256 位,比 DES 算法的密钥长度更长,安全性更高

public class AES {private static final String AES_ALGORITHM = "AES";// AES加密模式为CBC,填充方式为PKCS5Paddingprivate static final String AES_TRANSFORMATION = "AES/CBC/PKCS5Padding";// AES密钥为16位private static final String AES_KEY = "1234567890123456";// AES初始化向量为16位private static final String AES_IV = "abcdefghijklmnop";/*** AES加密** @param data 待加密的数据* @return 加密后的数据,使用Base64编码*/public static String encrypt(String data) throws Exception {// 将AES密钥转换为SecretKeySpec对象SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);// 将AES初始化向量转换为IvParameterSpec对象IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());// 根据加密算法获取加密器Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);// 初始化加密器,设置加密模式、密钥和初始化向量cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);// 加密数据byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));// 对加密后的数据使用Base64编码return Base64.getEncoder().encodeToString(encryptedData);}/*** AES解密** @param encryptedData 加密后的数据,使用Base64编码* @return 解密后的数据*/public static String decrypt(String encryptedData) throws Exception {// 将AES密钥转换为SecretKeySpec对象SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);// 将AES初始化向量转换为IvParameterSpec对象IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());// 根据加密算法获取解密器Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);// 初始化解密器,设置解密模式、密钥和初始化向量cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);// 对加密后的数据使用Base64解码byte[] decodedData = Base64.getDecoder().decode(encryptedData);// 解密数据byte[] decryptedData = cipher.doFinal(decodedData);// 返回解密后的数据return new String(decryptedData, StandardCharsets.UTF_8);}public static void main(String[] args) throws Exception {String data = "Hello World";String encryptedData = encrypt(data);System.out.println("加密后的数据:" + encryptedData);String decryptedData = decrypt(encryptedData);System.out.println("解密后的数据:" + decryptedData);}
}

AES 算法采用的密钥长度更长,密钥空间更大,安全性更高,能够有效地抵抗暴力破解攻击。当然,因为密钥长度较长,需要的存储也更多。

对于对称加密算法而言,最大的痛点就在于密钥管理困难,相比而言,非对称加密就没有这个担忧

2.2 非对称加密

非对称加密算法需要两个密钥,这两个密钥互不相同,但是相互匹配,一个称为公钥,另一个称为私钥。使用其中的一个加密,则使用另一个进行解密。例如使用公钥加密,则需要使用私钥解密。

RSA 算法是是目前应用最广泛的非对称加密算法

public class RSA {private static final String RSA_ALGORITHM = "RSA";/*** 生成RSA密钥对** @return RSA密钥对*/public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);keyPairGenerator.initialize(2048); // 密钥大小为2048位return keyPairGenerator.generateKeyPair();}/*** 使用公钥加密数据** @param data      待加密的数据* @param publicKey 公钥* @return 加密后的数据*/public static String encrypt(String data, PublicKey publicKey) throws Exception {Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encryptedData);}/*** 使用私钥解密数据** @param encryptedData 加密后的数据* @param privateKey    私钥* @return 解密后的数据*/public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {byte[] decodedData = Base64.getDecoder().decode(encryptedData);Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedData = cipher.doFinal(decodedData);return new String(decryptedData, StandardCharsets.UTF_8);}public static void main(String[] args) throws Exception {KeyPair keyPair = generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();String data = "Hello World";String encryptedData = encrypt(data, publicKey);System.out.println("加密后的数据:" + encryptedData);String decryptedData = decrypt(encryptedData, privateKey);System.out.println("解密后的数据:" + decryptedData);}}
  • 优点:安全性高,公钥可以公开,私钥必须保密,保证了数据的安全性;可用于数字签名、密钥协商等多种应用场景。

  • 缺点:加密、解密速度较慢,密钥长度越长,加密、解密时间越长;密钥长度过短容易被暴力破解,密钥长度过长则会增加计算量和存储空间的开销


http://chatgpt.dhexx.cn/article/fhHA0yJw.shtml

相关文章

6、摘要提取算法

目前主要方法有&#xff1a; 基于统计&#xff1a;统计词频&#xff0c;位置等信息&#xff0c;计算句子权值&#xff0c;再简选取权值高的句子作为文摘&#xff0c;特点&#xff1a;简单易用&#xff0c;但对词句的使用大多仅停留在表面信息。基于图模型&#xff1a;构建拓扑…

视频摘要算法概述

DSNet: A Flexible Detect-to-Summarize Network for Video Summarization 论文 代码 不同于以往将视频摘要视为回归问题&#xff08;没有考虑时间相关性和完整性约束&#xff09;&#xff0c;2021年&#xff0c;最早的考虑这两者。 视频摘要通常分为三步&#xff1a; 1、镜头…

信息摘要算法

Java常用的安全算法 目录概 述 LD is tigger forever&#xff0c;CG are not brothers forever&#xff0c; throw the pot and shine forever. Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor pe…

摘要算法(哈希算法)

1. HASH算法 哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。 哈希函数的主要作用不是完成数据加密与解密工作,它是用来检验数据完整性的重要技术,运算结果具有不可逆性。 通过哈希函数,可以为数据创建&…

五分钟搞懂摘要算法

一.摘要算法和摘要 1.概述 摘要算法又称哈希算法、散列算法。摘要也称哈希值&#xff0c;表示输入任意长度的数据&#xff0c;都会输出固定长度的数据。通过摘要算法&#xff08;比如MDS和SHA-1&#xff09;就可以得到该哈希值。 2.特点 长度固定&#xff0c;结果越长&#xff…

常用几种消息摘要算法

文章目录 1、MD5 (Message Digest algorithm 5 消息摘要算法版本5)2、SHA (Secure Hash Algorithm 安全散列算法)3、MAC (Hash Message Authentication Code 散列消息鉴别码) 消息摘要&#xff08;Message Digest&#xff09;又称为数字摘要&#xff08;Digital Digest&#xf…

摘要算法与加密(以MD5算法为例)

【README】 部分内容总结自&#xff1a; 摘要与加密的区别&#xff08;以MD5算法为例&#xff09; - 掘金https://juejin.cn/post/6844903561478799368 【1】摘要算法与加密区别 【1.1】摘要算法&#xff08;不可逆&#xff09; 1&#xff09;摘要算法&#xff1a; 说白了…

报文摘要算法

1 报文摘要算法 报文摘要算法是一种将任意长度报文转换成固定长度的报文摘要算法。它具有以下六个特点&#xff1a;能够作用于任意长度的报文&#xff1b;产生有限位数的标识信息&#xff1b;易于实现&#xff1b;具有单向性&#xff1b;具有抗碰撞性&#xff1b;具有高灵敏性…

摘要算法

摘要算法是一种能产生特殊输出格式的算法&#xff0c;这种算法的特点是&#xff1a;无论用户输入多少长度的原始数据&#xff0c;经过计算后输出的密文都是固定长度的&#xff0c;这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取&#xff0c;这种提取就是摘要&a…

JAVA摘要算法

数据摘要算法是密码学算法中非常重要的一个分支&#xff0c;它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能&#xff0c;由于其不可逆性&#xff0c;有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希&#xff08;Hash&#xff09;算法、散列算法。…

摘要算法和加密算法

什么是摘要算法&#xff1f; 摘要算法就是哈希算法&#xff0c;将一条任意长度字符串转为32位的哈希值&#xff0c;是单向的&#xff0c;不能解密。常见的摘要算法有MD5和SHA&#xff0c;本文将用java对MD5算法进行实现。 摘要算法的用途&#xff1f; 1.登录密码的加密&…

三种摘要算法的简单介绍

原文地址&#xff1a; http://blog.csdn.net/u013991521/article/details/48193953 介绍&#xff1a; 消息摘要算法分为三类&#xff1a; MD(Message Digest)&#xff1a;消息摘要 SHA(Secure Hash Algorithm)&#xff1a;安全散列 MAC(Message Authentication Code)&…

数据分析之运营篇

文章目录 1.指标体系定目标 1.1根据运营的目的&#xff0c;选取不同的指标类型 1.2.北极星指标 1.3 用户留存指标 2.数据分析找问题 2.1.描述分析 2.2多维分析 2.3.相关性分析 2.4.方差分析 2.5 样本检验 2.6 预测分析 3. 3A3R做决策 3.1洞察 3.2获客 3.3.活跃…

京东数据分析工程师(实习生)笔试

忙了一个星期&#xff0c;把最近的笔试面试记录一下。 京东前面单选多选题&#xff0c;后面3道编程题。小题考的很细&#xff0c;各种概率论统计数据库机器学习的知识点&#xff0c;很多都是蒙的&#xff0c;默默的把不会的题记下来&#xff0c;等再学会怎么做了以后发现蒙的都…

Python人力资源员工离职原因数据分析

本项目的数据集来源kaggle竞赛项目:HR-Analytics,自行下载即可! 1.提出问题 公司当中员工们离职的原因是什么? 什么样的员工会离职呢? 2.读取数据,理解数据 导入数据分析工具包,这次我们用seaborn库来优化我们的数据可视化图表! 读取数据 查看数据,head()方法没…

数据分析案例-电影数据分析

目录 电影数据集介绍 加载数据 数据探索和清洗 评分最多的电影 评分最高的电影 评分与年龄的关系 不同年龄段对某部电影的评分 电影数据集介绍 用户信息 #u.user #列名称 user_id,age,gender,occupation,zip_code #数据 1|24|M|technician|85711 2|53|F|other|94043 3…

数据分析岗位招聘分析

项目背景 学习实践数据分析&#xff0c;形成完整报告。分析目标&#xff1a;从行业、城市、学历、经验分析薪资及需求量分布情况 数据获取 集搜客获取拉勾【数据分析】为关键词的职位列表&#xff0c;根据列表职位详情地址爬取职位详情&#xff0c;435条记录,删除重复值后有…

数据分析的工作目标是什么

题图与内容无关&#xff0c;骗点击的。。。 其实这是回答我知识星球一位读者的问题&#xff0c;但恰好也是我现在在做的事情&#xff0c;所以想想&#xff0c;可以写一篇文章分享一下。 数据分析团队的工作方向&#xff0c;按照阶段分为如下目标。 1、提供准确、可靠、及时的基…

数据分析 面经(已拿到offer)

北航计算机专业&#xff08;计院太卷&#xff0c;现考虑转向信息安全方向&#xff09;本科二年级&#xff0c;闲来无事找份日常实习试试水 考虑数分岗也是因为楼主目前大二&#xff0c;专业课学习不够深入&#xff0c;开发技术尚不成熟&#xff0c;而sql、excel和数据可视化比…

数据分析笔试经典sql题解

欢迎关注微信公众号&#xff1a;开心数据 前言&#xff1a;sql是数据分析师笔试必考的考点之一&#xff0c;常考的题型有行列转换、联表查询&#xff0c;这些都比较简单&#xff0c;一般考的最难的就是hivesql窗口函数联表查询&#xff0c;普通的聚合函数每组(Group by)只返回…