返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java中五种最常见加密算法
  • 801
分享到

Java中五种最常见加密算法

java开发语言加密 2023-09-14 18:09:42 801人浏览 独家记忆
摘要

1 前言 大家平时的工作中,可能也在很多地方用到了加密、解密,比如: 用户的密码不能明文存储,要存储加密后的密文 用户的银行卡号、身份证号之类的敏感数据,需要加密传输 还有一些重要接口,比如支付

1 前言

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

  • 用户的密码不能明文存储,要存储加密后的密文

  • 用户的银行卡号、身份证号之类的敏感数据,需要加密传输

  • 还有一些重要接口,比如支付,客户端要对请求生成一个签名,服务端要对签名进行验证

  • ……

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

2 常见加密算法

算法整体上可以分为不可逆加密,以及可逆加密,可逆加密又可以分为对称加密和非对称加密。

2.1 不可逆算法

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

散列算法,就是一种不可逆算法。散列算法中,明文通过散列算法生成散列值,散列值是长度固定的数据,和明文长度无关。

在这里插入图片描述
散列算法的具体实现有很多种,常见的包括MD5、SHA1、SHA-224、SHA-256等等。

散列算法常用于数字签名、消息认证、密码存储等场景。

散列算法是不需要密钥的,当然也有一些不可逆算法,需要密钥,例如HMac算法。

2.1.1 MD5

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

我们来看下MD5算法的Java代码实现:

public class MD5 {    private static final String MD5_ALGORITHM = "MD5";    public static String encrypt(String data) throws Exception {        // 获取MD5算法实例        MessageDigest messageDigest = MessageDigest.getInstance(MD5_ALGORITHM);        // 计算散列值        byte[] digest = messageDigest.digest(data.getBytes());        FORMatter formatter = new Formatter();        // 补齐前导0,并格式化        for (byte b : digest) {            formatter.format("%02x", b);        }        return formatter.toString();    }    public static void main(String[] args) throws Exception {        String data = "Hello World";        String encryptedData = encrypt(data);        System.out.println("加密后的数据:" + encryptedData);    }}

MD5有一些优点,比如计算速度快、输出长度固定、应用广泛等等。

但是作为一个加密算法,它有一个天大的缺点,那就是不安全

MD5算法已经被攻破,而且MD5算法的输出长度有限,攻击者可以通过暴力破解或彩虹表攻击等方式,找到与原始数据相同的散列值,从而破解数据。

虽然可以通过加盐,也就是对在原文里再加上一些不固定的字符串来缓解,但是完全可以用更安全的SHA系列算法替代。

2.1.2 SHA-256

SHA(Secure Hash Algorithm)系列算法是一组密码散列函数,用于将任意长度的数据映射为固定长度的散列值。SHA系列算法由美国国家安全局(NSA)于1993年设计,目前共有SHA-1、SHA-2、SHA-3三种版本。

其中SHA-1系列存在缺陷,已经不再被推荐使用。

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

我们来看一下最常用的SHA-256的Java代码实现:

public class SHA256 {    private static final String SHA_256_ALGORITHM = "SHA-256";    public static String encrypt(String data) throws Exception {        //获取SHA-256算法实例        MessageDigest messageDigest = MessageDigest.getInstance(SHA_256_ALGORITHM);        //计算散列值        byte[] digest = messageDigest.digest(data.getBytes());        StringBuilder stringBuilder = new StringBuilder();        //将byte数组转换为15进制字符串        for (byte b : digest) {            stringBuilder.append(Integer.toHexString((b & 0xFF) | 0x100), 1, 3);        }        return stringBuilder.toString();    }    public static void main(String[] args) throws Exception {        String data = "Hello World";        String encryptedData = encrypt(data);        System.out.println("加密后的数据:" + encryptedData);    }}

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

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

2.2 对称加密算法

对称加密算法,使用同一个密钥进行加密和解密。

在这里插入图片描述
加密和解密过程使用的是相同的密钥,因此密钥的安全性至关重要。如果密钥泄露,攻击者可以轻易地破解加密数据。

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

2.2.1 DES

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

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

我们来看下DES算法的Java代码实现:

public class DES {    private static final String DES_ALGORITHM = "DES";        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);    }        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.2.2 AES

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

我们来看下AES算法的Java代码实现:

public class AES {    private static final String AES_ALGORITHM = "AES";    // AES加密模式为CBC,填充方式为PKCS5Padding    private 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";        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);    }        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.3 非对称加密算法

非对称加密算法需要两个密钥,这两个密钥互不相同,但是相互匹配,一个称为公钥,另一个称为私钥。

使用其中的一个加密,则使用另一个进行解密。例如使用公钥加密,则需要使用私钥解密。
在这里插入图片描述

2.3.1 RSA

RSA算法是是目前应用最广泛的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三人在1978年发明,名字来源三人的姓氏首字母。

我们看下RSA算法的Java实现:

public class RSA {    private static final String RSA_ALGORITHM = "RSA";        public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);        keyPairGenerator.initialize(2048); // 密钥大小为2048位        return keyPairGenerator.generateKeyPair();    }        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);    }        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);    }}

RSA算法的优点是安全性高,公钥可以公开,私钥必须保密,保证了数据的安全性;可用于数字签名、密钥协商等多种应用场景。

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

3 总结

这一期就给大家简单盘点了一下最常用的5种加密算法。

来源地址:https://blog.csdn.net/qq_37284798/article/details/131856488

--结束END--

本文标题: Java中五种最常见加密算法

本文链接: https://lsjlt.com/news/407639.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中五种最常见加密算法
    1 前言 大家平时的工作中,可能也在很多地方用到了加密、解密,比如: 用户的密码不能明文存储,要存储加密后的密文 用户的银行卡号、身份证号之类的敏感数据,需要加密传输 还有一些重要接口,比如支付...
    99+
    2023-09-14
    java 开发语言 加密
  • Golang中常见加密算法有哪些
    本文小编为大家详细介绍“Golang中常见加密算法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang中常见加密算法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.md5 加密&md...
    99+
    2023-07-05
  • Python中常见的加密解密算法有哪些
    1.url encode加密简介:当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至'/'做一下编码转换。# -*- codin...
    99+
    2023-05-16
    Python
  • .NET中常见的加解密算法详解
    目录一、MD5不可逆加密1、校验密码2、防篡改3、急速秒传4、源代码管理工具二、对称可逆加密三、非对称可逆加密一、MD5不可逆加密 不可逆加密是指将原文加密成密文以后,无法将密文解密...
    99+
    2024-04-02
  • Java常用的几种加密算法是什么
    本篇内容介绍了“Java常用的几种加密算法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简单的java加密算法有:BASE 严格地说,...
    99+
    2023-06-17
  • Python求最大公约数的五种常见方法
    求最大公约数是习题中比较常见的类型,下面小编会给大家提供五种比较常见的算法,记得帮忙点个赞哦! 一般来说,最大公约数的求法大概有5种 方法一:短除法         短除法是求最大公因数的一种方法,也可用来求最小公倍数。求几个数最大公因数的...
    99+
    2023-10-03
    python pycharm
  • 详解5种Java中常见限流算法
    目录01固定窗口02滑动窗口03漏桶算法04令牌桶05滑动日志06分布式限流07总结1.瞬时流量过高,服务被压垮? 2.恶意用户高频光顾,导致服务器宕机? 3.消息消费过快,导致数据...
    99+
    2023-05-14
    Java常见限流算法 Java限流算法 Java限流
  • java中Swing五种常见的布局方式
    Java中Swing常见的布局方式有以下五种:1. BorderLayout(边界布局):将容器分为东、南、西、北和中五个区域,每个...
    99+
    2023-09-16
    java
  • 盘点Python 爬虫中的常见加密算法
    目录前言1. 基础常识2. Base64伪加密3. MD5加密4. AES/DES对称加密密钥填充模式前言 今天小编就带着大家来盘点一下数据抓取过程中这些主流的加密算法,它们有什么特...
    99+
    2024-04-02
  • .NET中常见的加解密算法有哪些
    这篇文章主要讲解了“.NET中常见的加解密算法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET中常见的加解密算法有哪些”吧!一、MD5不可逆加密不可逆加密是指将原文加密成密文以后...
    99+
    2023-06-29
  • php几种常用的加密解密算法
    本文给大家介绍php的三种常用的加密解密算法,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 php 自带的加密函数:     不可逆的加密函数为:md5()、sha1()、crypt()     md5() 用来计算 M...
    99+
    2023-09-02
    php 算法 加密算法 解密算法
  • Java实现常用的三种加密算法详解
    目录前言密钥密钥分类密钥和密码密钥管理密钥生成信息摘要算法MD系列SHA系列对称加密算法DES3DESAES非对称加密算法前言 编程中常见的加密算法有以下几种,它们在不同场景中分别有...
    99+
    2024-04-02
  • Java几种常见的四舍五入的方法
    Java中常见的四舍五入的方法有以下几种:1. Math.round() 方法:该方法接收一个 float 或 double 类型的...
    99+
    2023-08-22
    Java
  • C#中常见的文件加密和解密算法问题
    C#中常见的文件加密和解密算法问题,需要具体代码示例在现代计算机应用中,数据的保护和安全显得尤为重要。文件加密和解密算法是一种常用的数据安全保护措施,可以确保文件在传输和存储过程中不被未授权的人员访问和修改。本文将探讨C#中常见的文件加密和...
    99+
    2023-10-22
    算法 解密 C#: 文件加密
  • java中几种常见的排序算法总结
    目录本节目标;【插入排序】【优化版】【希尔排序】【选择排序】【堆排序】 【冒泡排序】介绍一个冒泡排序的优化方法; 【快速排序】【归并排序】【正文】【代码简介;】&...
    99+
    2024-04-02
  • Python爬虫中常见的加密算法有哪些
    这篇文章主要讲解了“Python爬虫中常见的加密算法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python爬虫中常见的加密算法有哪些”吧!1. 基础常识首先我们需要明白的是,什么是...
    99+
    2023-07-02
  • 盘点 90% Python 爬虫中的常见加密算法
    相信大家在数据抓取的时候,会碰到很多加密的参数,例如像是"token"、"sign"等等,今天小编就带着大家来盘点一下数据抓取过程中这些主流的加密算法,它们有什么特征、加密的方式有哪些等等,知道了这些之后对于我们逆向破解这些加密的参数会起到...
    99+
    2023-05-14
    Python 爬虫 加密算法
  • Java实现常用的三种加密算法是什么
    这篇文章主要为大家展示了“Java实现常用的三种加密算法是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java实现常用的三种加密算法是什么”这篇文章吧。前言编程中常见的加密算法有以下几种,...
    99+
    2023-06-29
  • Linux下常见的加密算法有哪些
    这篇文章将为大家详细讲解有关Linux下常见的加密算法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux系统中常见的加密算法有:对称加密;非对称加密;单向加密;SSL/TLS;秘钥交换等。1、...
    99+
    2023-06-27
  • java常见的加密方法有哪些
    Java常见的加密方法有以下几种:1. 对称加密:对称加密算法使用相同的密钥对数据进行加密和解密,常见的对称加密算法有DES、3DE...
    99+
    2023-09-06
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作