讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

java使用教程怎样实现简单的加密解密功能 java使用教程的加密操作基础技巧​

秋明吖_5897

秋明吖_5897

发布时间:2025-08-07 19:43:01

|

1024人浏览过

|

来源于php中文网

原创

对称加密和非对称加密的核心区别在于密钥使用方式:对称加密使用同一把密钥进行加密和解密,而非对称加密使用一对密钥,公钥加密需私钥解密,私钥签名需公钥验证;2. 对于入门者,对称加密更适合,因其概念直观、实现简单,如aes算法通过生成密钥、初始化加密器、执行加解密即可完成,而非对称加密涉及公私钥管理、数字签名等复杂概念,学习曲线较陡;3. java中实现加密需注意安全实践:密钥不得硬编码或明文存储,应使用keystore、环境变量等安全方式管理;避免使用ecb等不安全模式,推荐cbc或gcm模式以增强安全性;确保密钥传输通过ssl/tls等加密通道进行,防止泄露。

java使用教程怎样实现简单的加密解密功能 java使用教程的加密操作基础技巧​

在Java里实现简单的加密解密功能,其实并不像想象中那么神秘,核心就是利用Java自带的

javax.crypto
包。对于初学者或者只是想对一些敏感数据做个基础保护,对称加密算法比如AES或者DES(虽然DES现在用得少了,但概念上很好理解)是个不错的起点。它能让你快速上手,感受到数据“变身”的乐趣。

要说具体怎么操作,我们拿AES来举个例子吧。它算是目前比较主流、安全性也相对可靠的对称加密算法了。整个过程,从生成密钥到加密再到解密,其实就是几步:

  1. 生成密钥: 这是加密解密的关键,就像你家门的钥匙。对称加密的特点就是加密和解密用的是同一把钥匙。
  2. 初始化加密器: 告诉Java你想用什么算法(比如AES),什么模式(比如ECB,虽然有局限性但简单易懂),以及用哪把密钥来加密。
  3. 执行加密: 把你的原始数据喂给加密器,它就吐出加密后的密文了。
  4. 初始化解密器: 同样,告诉它算法、模式和密钥,但这次是用来解密。
  5. 执行解密: 把密文喂给解密器,它就还你原始数据了。

下面这段代码,应该能让你对这个流程有个直观的感受:

立即学习“Java免费学习笔记(深入)”;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class SimpleAES {

    // AES算法名,通常会带上模式和填充方式,例如 "AES/ECB/PKCS5Padding"
    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding"; // ECB模式简单,但实际应用中推荐CBC等

    /**
     * 生成AES密钥
     * @return SecretKey对象
     * @throws Exception
     */
    public static SecretKey generateAESKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
        keyGen.init(128); // AES支持128, 192, 256位密钥
        return keyGen.generateKey();
    }

    /**
     * 加密数据
     * @param data 待加密的原始数据
     * @param key 用于加密的密钥
     * @return 加密后的Base64编码字符串
     * @throws Exception
     */
    public static String encrypt(String data, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    /**
     * 解密数据
     * @param encryptedData 加密后的Base64编码字符串
     * @param key 用于解密的密钥
     * @return 解密后的原始数据
     * @throws Exception
     */
    public static String decrypt(String encryptedData, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

    public static void main(String[] args) {
        try {
            SecretKey aesKey = generateAESKey();
            // 实际应用中,你可能需要将密钥保存或传输,这里为了演示直接使用
            // 将SecretKey转换为字节数组,方便存储或传输
            byte[] keyBytes = aesKey.getEncoded();
            // 从字节数组恢复SecretKey
            SecretKey restoredKey = new SecretKeySpec(keyBytes, ALGORITHM);


            String originalText = "这是一段需要加密的秘密信息。";
            System.out.println("原始文本: " + originalText);

            String encryptedText = encrypt(originalText, restoredKey);
            System.out.println("加密后: " + encryptedText);

            String decryptedText = decrypt(encryptedText, restoredKey);
            System.out.println("解密后: " + decryptedText);

            // 尝试用错误的密钥解密,会抛出BadPaddingException
            // SecretKey wrongKey = generateAESKey();
            // String wrongDecrypted = decrypt(encryptedText, wrongKey);
            // System.out.println("错误密钥解密: " + wrongDecrypted);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这段代码里,我们用

KeyGenerator
来生成密钥,然后用
Cipher
类来做具体的加密解密。注意,
SecretKey
对象本身是不能直接打印出来或者当作字符串传输的,你需要把它转换成
byte[]
,然后通过
SecretKeySpec
再还原回来。这也是为什么我在
main
方法里多加了一步
keyBytes
的转换,虽然在同一个程序里直接用
aesKey
也行,但模拟了密钥的持久化或传输场景。

Java中对称加密和非对称加密有什么区别?哪种更适合入门?

说起来,加密算法大致能分成两大类:对称加密和非对称加密。对于刚接触加密的同学来说,理解这两者的区别,对选择合适的加密方式非常重要。

AI舌诊面诊问诊医疗系统+诊疗商城系统源码
AI舌诊面诊问诊医疗系统+诊疗商城系统源码

AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。

下载

对称加密,顾名思义,就是加密和解密都用同一把密钥。就像你家大门的钥匙,开门和锁门都是它。它的优点是速度快,效率高,特别适合处理大量数据。AES、DES就是典型的对称加密算法。缺点嘛,就是密钥的管理比较麻烦,你需要想办法把这把“共享钥匙”安全地分发给所有需要加密和解密的人,一旦密钥泄露,所有加密的数据就都暴露了。

非对称加密就有点不一样了,它用的是一对密钥:一把是公开的(公钥),另一把是私有的(私钥)。公钥可以随便给别人,私钥你得自己藏好。用公钥加密的数据,只能用对应的私钥解密;反过来,用私钥加密的数据(这通常用于数字签名),只能用公钥解密。RSA就是最常见的非对称加密算法。它的优点是密钥分发方便,安全性高,因为你不需要共享私钥。但缺点也很明显,就是速度慢,效率低,不适合直接加密大量数据,通常用来加密对称密钥或者进行身份认证。

那么,哪种更适合入门呢?我个人觉得,对称加密是更好的选择。你看上面那个AES的例子,整个流程相对直观,概念也容易理解。你只需要关注一把密钥和数据的转换。非对称加密涉及到公钥、私钥、密钥对生成、签名、验证等概念,对于初学者来说,信息量会比较大,容易感到困惑。先从对称加密入手,打好基础,再逐步深入非对称加密,会是一个比较平滑的学习曲线。

在Java中实现加密功能时,有哪些常见的安全实践和注意事项?

光知道怎么写代码实现加密还不够,实际应用中,有些坑是必须得注意的。不然,你可能以为自己加密了,结果数据还是裸奔。

一个大头就是密钥管理。这是加密里最难、也最容易出问题的地方。你不能把密钥硬编码在代码里,也不能随便放在公开可访问的文件里。想象一下,如果你的加密密钥和加密算法都写在同一个地方,那不就是告诉黑客“钥匙藏在垫子下面”吗?密钥应该被安全地存储,比如使用Java的

KeyStore
,或者通过环境变量、安全的配置服务来获取。在网络传输密钥时,也必须使用SSL/TLS等安全协议。这部分其实比加密算法本身复杂得多,也是很多系统安全性的瓶颈。

再来就是算法和模式的选择。虽然前面例子用了AES/ECB/PKCS5Padding,但我要强调一下,ECB模式在实际应用中,如果加密的数据块有重复,密文也会有重复的模式,这可能会泄露一些信息。比如,你加密一张纯色图片,ECB模式下,加密后的图片仍然能看出轮廓。所以,更推荐使用CBC、GCM等模式。CBC

热门AI工具

更多
函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1938

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3184

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6384

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6569

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

8094

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

12574

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

6539

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

7327

2025.08.07

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 9.6万人学习

韩顺平 2016年 最新PHP基础视频教程
韩顺平 2016年 最新PHP基础视频教程

共47课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn