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 里的证书信任链。别怕,咱慢慢讲👇
数字签名三件套:
- 消息摘要(摘要算法如 SHA256)
- 私钥签名
- 公钥验签
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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
- 点赞
- 收藏
- 关注作者
评论(0)