Java技术专题:「入门到精通系列」深入探索常用的六种加密技术和实现

文章目录

    • 1. 引言
    • 2. 对称加密
    • 3. 非对称加密
    • 4. 哈希算法
    • 5. 消息摘要
    • 6. 数字签名
    • 7. 数字证书
    • 8. 拓展功能与未来展望

在这里插入图片描述

🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:Java学习路线
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

1. 引言

随着信息安全的日益重要,加密技术在软件开发领域中扮演着关键的角色。Java作为一门广泛应用的编程语言,提供了丰富的加密库和API,使得开发者可以轻松实现各种加密算法。本文将深入探索Java技术中常用到的六种加密技术,包括对称加密、非对称加密、哈希算法、消息摘要、数字签名和数字证书,并通过具体的实现代码帮助读者更好地理解和应用这些加密技术。

在这里插入图片描述

2. 对称加密

对称加密是指加密和解密使用相同的密钥的加密算法。Java中常用的对称加密算法有DES、3DES、AES等。下面以AES算法为例演示对称加密的基本使用。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.Key;public class SymmetricEncryptionExample {public static void main(String[] args) throws Exception {// 生成AES密钥Key key = generateAESKey();// 待加密的数据String data = "Hello, Symmetric Encryption!";// 加密byte[] encryptedData = encrypt(data.getBytes(), key);// 解密byte[] decryptedData = decrypt(encryptedData, key);// 输出结果System.out.println("Original Data: " + data);System.out.println("Encrypted Data: " + new String(encryptedData));System.out.println("Decrypted Data: " + new String(decryptedData));}private static Key generateAESKey() throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128);return keyGenerator.generateKey();}private static byte[] encrypt(byte[] data, Key key) throws Exception {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, key);return cipher.doFinal(data);}private static byte[] decrypt(byte[] data, Key key) throws Exception {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, key);return cipher.doFinal(data);}
}

在上述代码中,通过KeyGenerator生成AES密钥,然后使用Cipher进行加密和解密操作。对称加密适用于对数据的保密性要求较高的场景,但密钥的管理和分发是一个挑战。

3. 非对称加密

非对称加密使用一对公私钥,公钥用于加密,私钥用于解密。Java中常用的非对称加密算法有RSA、DSA等。以下是RSA算法的简单实例。

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;public class AsymmetricEncryptionExample {public static void main(String[] args) throws Exception {// 生成RSA密钥对KeyPair keyPair = generateRSAKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 待加密的数据String data = "Hello, Asymmetric Encryption!";// 使用公钥加密byte[] encryptedData = encrypt(data.getBytes(), publicKey);// 使用私钥解密byte[] decryptedData = decrypt(encryptedData, privateKey);// 输出结果System.out.println("Original Data: " + data);System.out.println("Encrypted Data: " + new String(encryptedData));System.out.println("Decrypted Data: " + new String(decryptedData));}private static KeyPair generateRSAKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);return keyPairGenerator.generateKeyPair();}private static byte[] encrypt(byte[] data, PublicKey publicKey) throws Exception {// 使用Cipher类进行加密// ...}private static byte[] decrypt(byte[] data, PrivateKey privateKey) throws Exception {// 使用Cipher类进行解密// ...}
}

在实际应用中,公钥一般用于加密敏感信息,私钥用于解密。非对称加密适用于密钥管理较为简单、不需要频繁更新的场景。

4. 哈希算法

哈希算法将任意长度的数据映射成固定长度的哈希值,常用于密码存储、数字签名等场景。Java中常用的哈希算法有MD5、SHA-1、SHA-256等。以下是使用SHA-256算法计算哈希值的例子。

import java.security.MessageDigest;public class HashAlgorithmExample {public static void main(String[] args) throws Exception {// 待计算哈希值的数据String data = "Hello, Hash Algorithm!";// 计算SHA-256哈希值byte[] hashValue = hash(data.getBytes(), "SHA-256");// 输出结果System.out.println("Original Data: " + data);System.out.println("Hash Value: " + new String(hashValue));}private static byte[] hash(byte[] data, String algorithm) throws Exception {MessageDigest messageDigest = MessageDigest.getInstance(algorithm);return messageDigest.digest(data);}
}

哈希算法的特点是不可逆,同样的输入会产生相同的哈希值。在密码存储中,常用哈希算法对用户密码进行单向加密存储,增加了安全性。

5. 消息摘要

消息摘要是通过哈希算法对消息进行摘要,得到一个固定长度的值。与哈希算法不同的是,消息摘要通常与某个密钥相关联。Java中,Mac类提供了消息摘要的功能。以下是使用HmacSHA256算法计算消息摘要的例子。

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import java.security.Key;public class MessageDigestExample {public static void main(String[] args) throws Exception {// 生成HmacSHA256密钥Key key = generateHmacSHA256Key();// 待计算消息摘要的数据String data = "Hello, Message Digest!";// 计算HmacSHA256消息摘要byte[] digest = digest(data.getBytes(), key, "HmacSHA256");// 输出结果System.out.println("Original Data: " + data);System.out.println("Message Digest: " + new String(digest));}private static Key generateHmacSHA256Key() throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");return keyGenerator.generateKey();}private static byte[] digest(byte[] data, Key key, String algorithm) throws Exception {Mac mac = Mac.getInstance(algorithm);mac.init(key);return mac.doFinal(data);}
}

消息摘要在保证数据完整性的同时,还能提供一定程度的安全性。Hmac算法通过在哈希算法的基础上加入密钥,增加了对抗彩虹表攻击等的能力。

6. 数字签名

数字签名是一种用于验证消息来源和完整性的技术。Java中,Signature类提供了数字签名的功能。以下是使用RSA算法进行数字签名和验证的例子。

import java.security.*;public class DigitalSignatureExample {public static void main(String[] args) throws Exception {// 生成RSA密钥对KeyPair keyPair = generateRSAKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 待签名的数据String data = "Hello, Digital Signature!";// 数字签名byte[] signature = sign(data.getBytes(), privateKey);// 验证数字签名boolean verified = verify(data.getBytes(), signature, publicKey);// 输出结果System.out.println("Original Data: " + data);System.out.println("Signature: " + new String(signature));System.out.println("Verification Result: " + verified);}private static KeyPair generateRSAKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);return keyPairGenerator.generateKeyPair();}private static byte[] sign(byte[] data, PrivateKey privateKey) throws Exception {Signature signature = Signature.getInstance("SHA256withRSA");signature.initSign(privateKey);signature.update(data);return signature.sign();}private static boolean verify(byte[] data, byte[] signature, PublicKey publicKey) throws Exception {Signature verifySignature = Signature.getInstance("SHA256withRSA");verifySignature.initVerify(publicKey);verifySignature.update(data);return verifySignature.verify(signature);}
}

数字签名通过私钥进行签名,公钥进行验证,保证了消息的完整性和真实性。在数字签名中,除了RSA算法,还有其他算法如DSA等。

7. 数字证书

数字证书是用于在网络上识别用户身份的一种手段。在Java中,KeyStoreCertificate等类提供了数字证书的管理和使用。以下是简单的数字证书示例。

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PublicKey;
import java.security.cert.Certificate;public class DigitalCertificateExample {public static void main(String[] args) throws Exception {// 加载数字证书Certificate certificate = loadCertificate("path/to/certificate.jks", "password", "alias");// 获取公钥PublicKey publicKey = certificate.getPublicKey();// 输出结果System.out.println("Public Key: " + publicKey);}private static Certificate loadCertificate(String path, String password, String alias) throws Exception {FileInputStream fis = new FileInputStream(path);KeyStore keyStore = KeyStore.getInstance("JKS");keyStore.load(fis, password.toCharArray());return keyStore.getCertificate(alias);}
}

数字证书在网络通信中广泛应用,例如HTTPS中的SSL证书。数字证书的合法性验证需要借助信任链等机制,以确保证书的真实性和有效性。

8. 拓展功能与未来展望

在实际应用中,加密技术的选择取决于具体的业务场景和安全需求。为了提高系统的安全性,开发者可以根据实际需求结合多种加密技术进行使用。此外,随着量子计算等新技术的发展,加密算法也面临着新的挑战,开发者需要密切关注加密领域的最新动态。

总的来说,Java提供了丰富的加密库和API,使得开发者能够轻松实现各种加密算法。掌握并灵活运用这些加密技术,对于确保系统的信息安全至关重要。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产品经理如何选择城市?

年底,全国性的人口大迁徙即将开始。选择城市,堪称年轻人的“二次投胎”,族望留原籍,家贫走他乡。 古人在选择城市时,主要的考量因素是家族势力,这一点放在当代,大致也成立,如果在老…

如何在CentOS安装SQL Server数据库并通过内网穿透工具实现公网访问

文章目录 前言1. 安装sql server2. 局域网测试连接3. 安装cpolar内网穿透4. 将sqlserver映射到公网5. 公网远程连接6.固定连接公网地址7.使用固定公网地址连接 前言 简单几步实现在Linux centos环境下安装部署sql server数据库,并结合cpolar内网穿透工具&#xff0…

C# 反射的终点:Type,MethodInfo,PropertyInfo,ParameterInfo,Summry

文章目录 前言反射是什么?常用类型操作SummryPropertyInfoMethodInfo无参函数运行 有参函数运行,获取paramterInfo 总结 前言 我之前写了一篇Attribute特性的介绍,成功拿到了Attribute的属性,但是如果把Attribute玩的溜,那就要彻…

什么是企业数字化转型?数字化的价值体现在哪里?

从2015年接触平安的数字化转型,到2021年承接阿里云的服务数字化项目,再到2023年主导大大小小10来个数字化项目,8年的时间,数字化对我而言已经从一个“新词”变成了一个“旧词”。 8年过去,数字化也从一道企业的“选做…

迎接人工智能的下一个时代:ChatGPT的技术实现原理、行业实践以及商业变现途径

课程背景 2023年,以ChatGPT为代表的接近人类水平的对话机器人,AIGC不断刷爆网络,其强大的内容生成能力给人们带来了巨大的震撼。学术界和产业界也都形成共识:AIGC绝非昙花一现,其底层技术和产业生态已经形成了新的格局…

[Vulnhub靶机] DriftingBlues: 2

[Vulnhub靶机] DriftingBlues: 2靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/driftingblues/driftingblues2.ova 靶机地址:192.168.67.21 攻击机地址:192.168.67.3 一、信息收集 1.…

led手电筒照明线性恒流驱动芯片推荐:SM2123EGL双通道可调光

LED手电筒照明线性恒流驱动芯片是一种专门用于LED手电筒的照明系统的关键组件。它采用了线性恒流驱动技术,可以确保LED手电筒在不同电池电压和温度变化下,保持恒定的亮度输出,提高了LED手电筒的稳定性和可靠性。 LED手电筒照明线性恒流驱动芯…

VScode右键没有go to definition选项

1. 背景 1.1. 项目代码在远程服务器上; 1.2. win重装系统,重新安装vscode出现问题,没重装系统之前是没问题的; 2. 问题 打开vscode,通过ssh链接远程服务器中的项目代码后,选中函数右键没有go to defini…

大连理工大学软件学院2022年秋季学期《矩阵与数值分析》上机作业

文章目录 《计算机科学计算》第二版162页第12题(1)162页第16题216页第12题 《数值分析方法与应用》一、基础知识部分1、5、 二、线性方程组求解2、6、 三、非线性方程组求解1、4、 四、插值与逼近1、5、7、 五、数值积分2、 六、微分方程数值解法1、 《计…

机房自动化监控手把手分享给你 - 番外1:声光报警实现

本文章是一个机房自动化监控实际项目系列文章的番外篇,有个朋友问能否补充一个声光报警的实现,我仔细一想:虽然我不在这个项目中实现声光报警,但我在其他项目用过,使用的设备器件成本很低。那就以这个项目为背景&#…

视频转为序列图的软件,让视频批量转为序列图

你是否曾经遇到过这样的困境:需要将一段视频转为一系列的图片,但却没有合适的工具来完成?或许你曾经手动截图,或者用其他方式,但结果往往不尽如人意,图片质量差、色彩失真、画面不清晰。现在,让…

C语言动态内存管理

我们目前知道的开辟内存空间的方法有: 1.创建变量 2.创建数组; 但是这2种方法开辟的空间大小都是固定的,如果是数组的话确认了大小之后是无法改变的; int a10;//在栈区空间上开辟4个字节的空间;int arr[10];//在栈…

C++ 模板进阶

目录 一、非类型模板参数 二、模板的特化 1、函数模板特化 2、类模板特化 全特化 偏特化 3、例题 三、模板分离编译 1、定义 2、解决方法 3、模板总结 一、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中&#xf…

10本审稿及出版效率均较好的科普期刊参数分享!

医、药、护、技及医学工程等相关的人员,进行卫生高级职称评审时,需要在专业期刊上公开发表本专业学术论文,论文的方向、内容质量以及发表的刊物都至关重要。今天常笑医学给大家整理了10本审稿及出版效率均较好的科普期刊!参数分享…

【开源GPT项目 - 在问】让知识无界,智能触手可及

Chatanywhere: chatAnywhere 在问 | 让知识无界,智能触手可及 项目简介 这是一个免费的在线聊天工具,旨在让用户更方便地享受科技带来的便利。用户可以使用我们的工具来获取答案、寻求建议、进行翻译和计算等等。这是由一位个人开发者创建的&#xff…

MLP(多层感知机) 虚战1

使用Keras实现MLP 前两节地址: CSDNmatplotlib 虚战1-CSDN博客 (数据的获取在这有说明) 数据预处理 虚战1-CSDN博客CSDN 数据预处理的最后一步:将数据集分为 训练数据集、测试数据集和校验数据集。 训练数据集&#xff1a…

vue中key的用法

加key是提升vue渲染效率,减少DOM操作。 vue列表元素的更新机制: 当列表元素没有设置key的时候,vue判断是否操作这个DOM元素,是根据新旧两次数据的元素顺序进行对比,看一下元素内容是否发生变化。发生变化vue就操作这个…

TS 36.211 V12.0.0-通用功能

本文的内容主要涉及TS 36.211,版本是C00,也就是V12.0.0。

【Flutter 开发实战】Dart 基础篇:最基本的语法内容

在深入了解 Dart 这门编程语言之前,我们需要了解一些关于 Dart 的最基本的知识,像是常量、变量、函数等等,这样才能够让我们的开发效率更上一层楼。在本节,我们将探讨一些基础语法,包括入口方法 main、变量、常量以及命…

【数位dp】【动态规划】C++算法:233.数字 1 的个数

作者推荐 【动态规划】C算法312 戳气球 本文涉及的基础知识点 动态规划 数位dp LeetCode:233数字 1 的个数 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1: 输入:n 13 输出:6 示例 2&#xff…