Java实现密码的加密与解密

2025-07-23 4:44:07 秘籍 思思

嘿,朋友们!今天咱们不聊八卦、不谈天气,就来点“暗黑秘籍”——Java技术界的密码加密解密大招!你是不是也遇到过那种甩到后台,用户信息藏的死死的,却不敢随便给权限,生怕数据被“看光光”?

别怕!我这篇文章就带你玩转Java的密码加密与解密,不用你成为技术大神,普通程序猿也可以轻松上手!从基础算法到实战应用,咱们都要滴!

## 密码加密的第一步:选择好“武器”

在Java世界里,密码加密的主角有:MD5、SHA-1、SHA-256 这几位“老骨干”。不过要搞明白,这些其实是单向加密算法,也就是说“只许走不许退”,主要用在存储密码,不能用来解密还原。

如果你真想到密码能“翻牌子”一样被还原,必须用到“对称加密算法”,比如AES(高级加密标准)或者DES(数据加密标准)。当然,AES比起老古董DES,安全性可是杠杠滴!

那么问题来了:你搞定密码,最在意的又是什么?安全?速度?还是方便?不同场景,选择不同的密码“神器”。

## 常用加密算法盘点

- **MD5(Message Digest Algorithm 5)**:经典中的经典,用途广泛,比如存hash值,验证数据完整性,最怕的就是撞库攻击,别用在存密码啦!安全性已被削弱。

- **SHA系列(Secure Hash Algorithm)**:SHA-256孰优孰劣?不用纠结,就是比MD5“更年轻、更安全”,适合存密码hash。

- **AES(高级加密标准)**:数据的“金刚不坏之身”,支持对称加密,密钥管理好就可以实现“前后端同一代码库的密码解密”。

- **RSA(非对称加密)**:硬核的密码“天王”,用秘钥对进行加密,解密要用对应的私钥,典型代表:SSL证书。

## Java实现密码的“金光闪闪”

### 1. 用MD5生成密码hash

```java

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class MD5Util {

public static String md5(String input) {

try {

MessageDigest md = MessageDigest.getInstance("MD5");

byte[] messageDigest = md.digest(input.getBytes());

StringBuilder hexString = new StringBuilder();

for (byte b : messageDigest) {

String hex = Integer.toHexString(0xff & b);

if (hex.length() == 1) hexString.append('0');

hexString.append(hex);

}

return hexString.toString();

} catch (NoSuchAlgorithmException e) {

throw new RuntimeException("MD5算法不见啦!", e);

}

}

}

```

调用:`String hashedPassword = MD5Util.md5("你的小秘密");`

说到这里,有没有感觉像在拍《哈利波特》?“魔法师们”用魔咒让密码变成“哈希值”。但是,别忘了:MD5已不再可靠,用它存密码,只能让黑客笑出声。

### 2. 用SHA-256加强安全

```java

import java.security.MessageDigest;

public class SHA256Util {

public static String sha256(String input) {

try {

MessageDigest md = MessageDigest.getInstance("SHA-256");

byte[] hash = md.digest(input.getBytes());

StringBuilder hexStr = new StringBuilder();

for (byte b : hash) {

String hex = Integer.toHexString(0xff & b);

if(hex.length() == 1) hexStr.append('0');

hexStr.append(hex);

}

return hexStr.toString();

} catch (NoSuchAlgorithmException e) {

throw new RuntimeException("SHA-256不见啦!快找它!", e);

}

}

}

```

头像一抬:这就像给密码穿了一套“钢铁侠”装备,秒变“抗打击”。

### 3. AES对称加密,密码的“秘密武器”

假如你有个超级秘密的订单,要加密存储、传输,AES绝对不二之选。示例代码:

```java

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import java.util.Base64;

public class AESUtil {

private static final String KEY_ALGORITHM = "AES";

// 生成密钥

public static SecretKey generateKey() throws Exception {

KeyGenerator keyGen = KeyGenerator.getInstance(KEY_ALGORITHM);

keyGen.init(128);

return keyGen.generateKey();

}

// 加密

public static String encrypt(String content, SecretKey key) throws Exception {

Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] encryptedBytes = cipher.doFinal(content.getBytes());

return Base64.getEncoder().encodeToString(encryptedBytes);

}

// 解密

public static String decrypt(String encrypted, SecretKey key) throws Exception {

Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE, key);

byte[] decodedBytes = Base64.getDecoder().decode(encrypted);

byte[] decryptedBytes = cipher.doFinal(decodedBytes);

return new String(decryptedBytes);

}

}

```

调用例子:

```java

SecretKey key = AESUtil.generateKey();

String encrypted = AESUtil.encrypt("密码秘密!", key);

String decrypted = AESUtil.decrypt(encrypted, key);

System.out.println("加密后:" + encrypted);

System.out.println("解密还原:" + decrypted);

```

这下密码不仅“藏得住”,还能“传得快”,炫酷得不要不要的。

## 实战小技巧:密码存储方案

- **盐值(Salt)**:不要把密码直接用哈希处理,加入随机盐值(也叫“调味料”),防止“撞库大战”。

- **多次哈希(Hash Iteration)**:用一个算法反复哈希,比如PHP的bcrypt、PBKDF2等,安全性飙升。

- **加密与解密的区分**:存密码的时候,用哈希;传输中用对称加密。

对了,记得咱们在密码加密时不要忘了“换个姿势”——多用SSL/TLS协议搞个“传输加密通道”!保证数据传输的安全。

好多小伙伴问:“我是不是还要搞个登录验证什么的?”当然啦,密码只是一半,验证用户身份、权限管理、日志审计,那才是真的牛逼。

说到这里,突然觉得,有没有一种可能:密码其实也是一种“密语”呢?谁会千方百计去破解你的小秘密,是不是像在玩“密室逃脱”游戏?唉,明明都是密码——但藏得那么深,够不够“神秘”?

对了,顺便告诉你一句:玩游戏想要赚零花钱就上七评赏金榜,网站地址:bbs.77.ink。赚钱可是秒秒钟的事,你还在等啥?

你以为密码就这么简单?嘿嘿,别小看Java的威力,要想逆袭密码世界,无敌的代码让你畅快淋漓!辣么多秘密在等你去发掘……如果你还想挑战更复杂的加密算法,记得回头找我!好了,今天到这里,是不是觉得代码也能变得有趣多了?快去写写你自己的“密码秘笈”吧!