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

news2024/9/21 13:58:25

文章目录

    • 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.coloradmin.cn/o/1367206.html

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

相关文章

第一个Java网络爬虫程序

目录 前言第一个Java网络爬虫程序总结 前言 网络爬虫是一种获取互联网信息的技术,它可以模拟浏览器行为,访问网站并提取所需的数据。在这个小Demo中,我们使用Java语言结合HttpClient库实现了一个简单的爬虫程序,用于抓取汽车之家…

任务调度中心

可以服务器配置和权限,分配任务执行。当服务器下线后,任务会被在线服务器接管,当重新上线后会在次执行任务。接管任务的服务器会释放任务。调度过程的实现,可以二次开发。基于 netty tcp 通信开发。 下载地址: http:/…

听GPT 讲Rust源代码--library/core/benches

File: rust/library/core/benches/slice.rs 文件路径:rust/library/core/benches/slice.rs 这个文件是Rust标准库中的一个示例(benchmark)文件,用来测试切片(slice)在不同情况下的性能。 Rust的切片是对数组…

QT:单例

单例的定义 官方定义:单例是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。 单例的写法 抓住3点: 构造函数私有化(确保只有一个实例)提供一个可以获取构造实例的接口(提供唯一的实…

在 sealos 上使用 redisinsight 完美管理 redis

先起一个 redis 集群,在 sealos 上可以点点鼠标就搞定: 简单两步,redis 集群搞定。 再启动 RedisInsight, 是一个 redis 的可视化管理工具。 就可以看到部署后的地址了。进去之后填写 redis 的链接信息即可: 链接信息在数据库的…

已解决 ValueError: Data cardinality is ambiguous 问题

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

网络字节序与主机字节序

字节序区分 多字节的数值在内存中高低位的排列方式会影响所表示的数值处理方式和显示。字节序以字节为基本单位,表示不同字节的存储顺序。 从存储顺序上区分,可分为大端字节序和小端字节序。从处理上区分,可区分为网络字节序和主机字节序。…

YY9702.102-2021 医疗设备EMC检测知识

一:CE(传导发射试验) 在做医疗器械机器EMC实验时,根据YY9706.102-2021的要求,按照图一流程先对表一进行填写。 设备分类和分组:《GB4824-2019》 根据以上对ME设备进行分组和分类,例如血透机属于…

Java课程设计个人博客

目录 引言:在此说明在本次课设过程中所遇到的困难! 一、项目搭建的问题 Q1:Web项目应用啥么编译器编写? Q2:如何创建Web项目(MAVEN)? Q3:Tomcat服务器开头控制台显示乱码如何解决? Q4:Tomcat服务器怎么设置项目的…

gem5学习(9):构建gem5——Building gem5

目录 一、Requirements for gem5 二、Getting the code 三、Your first gem5 build 1、gem5 binary types 四、Common errors 1、gcc版本过低 2、使用非默认版本的python 3、未安装M4宏处理器 4、Protobuf版本过低 前面的gem5学习(3)—&#xf…

Java面试高招:程序员如何在面试中脱颖而出

Java面试高招:程序员如何在面试中脱颖而出 《Java面试高招:程序员如何在面试中脱颖而出》摘要引言面试经历面试失败的反思 面试技巧侦探式的问题解决无敌铁金刚的坚定决心 参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1…

安全典型配置(六)配置IPSG限制非法主机访问内网案例(静态绑定)

相关文章学习: 安全典型配置(一)使用ACL限制FTP访问权限案例 安全典型配置(二)使用ACL限制用户在特定时间访问特定服务器的权限案例 安全典型配置(三)使用ACL禁止特定用户上网案例安全典型配置…

产品经理如何做好需求评审?掌握五大关键要素

随着产品经理职位的日益重要,对产品需求的评审也越来越重要。一个成功的产品经理需要不仅仅是拥有好的产品理念和市场分析能力,更需要拥有好的需求评审能力,这样才能够确保产品能够顺利开发,最终成功上市。那么,产品经…

【系统高级-环境变量】path配置一整行,而不是列表

这是列表编辑方便。但是不知道为什么变成一行,非常的令人抓狂,经过研究发现,第一个环境变量必须为C:\Windows\system32 开头才可以 文章如下 修改环境变量中的一行变成列表形式_环境变量编辑不是列表-CSDN博客

WiFi6工业网关能为工业物联网带来哪些改进?

WiFi 6( 802.11ax)比其前身WiFi 5(802.11ac)带来了多项改进,例如更快的通信速率、更大的带宽容量、在多设备连入时更稳定的性能、更大的链接范围、增强的安全性以及更好地支持物联网工作负载等,本篇就为大家…

实战:使用docker容器化服务与文件挂载-2

接着上文,演示Elasticsearch 和 Kibana 的安装,并讲解文件挂载 Elasticsearch of Docker (Kibana) 1、Elasticsearch 安装 ElasticSearch 使用 Docker 安装:https://www.yuque.com/zhangshuaiyin/guli-mall/dwrp5b 1.…

Linux第20步_在虚拟机上安装“Visual Studio Code”

1、双击windows系统桌面上的“FileZilla Client.exe”,打开FTP客户端,点击03软件下的Visual Studio Code,发现code_1.50.1-1602600906_amd64。 2、点击“文件”,然后点击“站点管理器”,见下图操作: 3、点…

猫头虎分享已解决Bug || Go Error: cannot use str (type string) as type int in assignment

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

Python将Labelme文件的真实框和预测框绘制到图片上

Python将Labelme文件的真实框和预测框绘制到图片上 前言前提条件相关介绍实验环境Python将Labelme文件的标注信息绘制到图片上代码实现输出结果 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入Python日常小操作专…

这些专利知识你知道吗?

专利作为一种重要的知识产权保护形式。专利不仅成为了企业核心竞争力的重要组成部分,也成为了国家创新发展的重要支撑。 专利是指国家专利主管机关授予发明创造申请人的一种专有权,这种专有权具有独占性、排他性和法律强制性,能够为持有者带来…