Java 安全编程,你的代码真安全吗?——别等出事才想起“安全这回事”!

举报
喵手 发表于 2025/09/24 21:43:12 2025/09/24
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

坦白讲,我以前对“安全”这事没太上心。毕竟一个小小的业务系统,能有多大事?直到有一次,我写了个登录接口,第二天数据库被注入删表,业务同事直接暴走:“你这是在练毁灭性测试吗?” 😭

从那以后我就悟了:代码可以丑,性能可以差,但安全千万不能掉以轻心!

今天我们就来聊聊 Java 安全编程的硬核部分:加密算法、框架支持、漏洞防护以及数字签名背后的信任机制。不是说给你吓唬,而是希望你别在“系统崩了”才开始查 CVE。


一、安全框架:JCE & JCA 到底啥关系?

Java 在安全领域其实给了你很多“法宝”,只不过你可能一直没用它们而已。

JCA(Java Cryptography Architecture)

Java 加密体系架构的“老大哥”,定义了所有安全机制的接口和标准,例如:

  • 消息摘要(Message Digest)
  • 数字签名(Digital Signature)
  • 密钥生成(KeyGenerator)
  • 加密/解密(Cipher)

它是一个抽象标准,你可以理解为一个“公安部”,定下规矩,但具体执行还得看地方派出所。

JCE(Java Cryptography Extension)

JCE 是 JCA 的“加强版”,专注于对称/非对称加密,像 AES、DES、RSA 都归它管。
可以理解为:JCA 是法律,JCE 是执行法官

👉 日常开发,其实你操作的加密 API,大多数底层都来自于这两个框架。


二、加密算法:你的密码,真的藏得住吗?

我们常见的加密方式分两大类:对称加密 & 非对称加密


1. 对称加密(如 AES)

加密和解密用同一把钥匙,效率高,但最大的问题是:密钥怎么传?

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AesExample {
    public static void main(String[] args) throws Exception {
        String msg = "Hello Security!";
        String key = "1234567812345678"; // 16字节密钥

        Cipher cipher = Cipher.getInstance("AES");
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");

        // 加密
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        byte[] encrypted = cipher.doFinal(msg.getBytes());
        System.out.println("加密后:" + Base64.getEncoder().encodeToString(encrypted));

        // 解密
        cipher.init(Cipher.DECRYPT_MODE, keySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        System.out.println("解密后:" + new String(decrypted));
    }
}

👉 小贴士:密钥千万别硬编码在代码里!你不是在送人钥匙,而是在送命!


2. 非对称加密(如 RSA)

公钥加密,私钥解密;安全性强,但性能慢。

import java.security.*;
import javax.crypto.Cipher;
import java.util.Base64;

public class RsaExample {
    public static void main(String[] args) throws Exception {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048); // 越大越安全
        KeyPair kp = kpg.generateKeyPair();

        PublicKey pubKey = kp.getPublic();
        PrivateKey priKey = kp.getPrivate();

        // 加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        byte[] encrypted = cipher.doFinal("秘密信息".getBytes());

        // 解密
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        byte[] decrypted = cipher.doFinal(encrypted);

        System.out.println("原文:" + new String(decrypted));
    }
}

👉 非对称加密一般用于“传密钥”,主业务数据还是交给 AES 去跑。


三、数字签名 & 证书:谁给你的数据背书?

想验证数据是不是被“动手脚”了?这就得靠数字签名。再深一点,就是 SSL/TLS 里的证书信任链。别怕,咱慢慢讲👇


数字签名三件套:

  1. 消息摘要(摘要算法如 SHA256)
  2. 私钥签名
  3. 公钥验签
import java.security.*;

public class SignatureExample {
    public static void main(String[] args) throws Exception {
        KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
        gen.initialize(2048);
        KeyPair pair = gen.generateKeyPair();

        Signature sig = Signature.getInstance("SHA256withRSA");

        // 签名
        sig.initSign(pair.getPrivate());
        sig.update("重要数据".getBytes());
        byte[] signature = sig.sign();

        // 验签
        sig.initVerify(pair.getPublic());
        sig.update("重要数据".getBytes());
        boolean result = sig.verify(signature);

        System.out.println("验签结果:" + result);
    }
}

数字证书(X.509)

这东西你肯定见过,比如 .crt.pem 文件。它的核心是:由权威机构(CA)签发的公钥认证文件,谁验证都靠谱。

浏览器访问 HTTPS 网站时,就是在偷偷检查这证书信不信得过。


四、安全漏洞防护:这些“经典雷”,你一定踩过💥

别说什么“我们不会有黑客来入侵”这种鬼话了,很多时候,代码的最大漏洞是开发者的轻敌。


SQL注入

String sql = "SELECT * FROM users WHERE username='" + input + "'";

🚨 危险场景:用户传入 admin' OR '1'='1
✅ 正确姿势:永远用 PreparedStatement

PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE username=?");
ps.setString(1, input);

XSS(跨站脚本攻击)

前端输出用户输入内容时不转义,比如:

<div>${user.comment}</div>

攻击者输入 <script>alert('中招了')</script> 就弹了你个大马猴子脸😅

✅ 解决方式:

  • HTML 转义
  • 使用模板引擎默认的转义机制(如 Thymeleaf)

CSRF(跨站请求伪造)

攻击者诱导用户点击伪造的请求,冒充用户进行操作。

✅ 解决方案:

  • 添加 CSRF Token 并验证
  • Referer 校验
  • 使用 SameSite cookie 策略

结语:安全从不是可选项,而是底线

你也许可以写出优雅架构、秒杀业务逻辑,但一旦安全出问题,一切都白搭。
加密、签名、证书、防注入……这些不是“上了再说”的事,而是从一开始就要考虑进设计里的事。

那么问题来了:

🔐 你写的系统,是能挡住黑客,还是连初学者都能绕过?

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。