专业的JAVA编程教程与资源

网站首页 > java教程 正文

京东大佬问我,常用的信息加密算法有哪些?举例说明其用法与流程

temp10 2025-04-27 16:18:46 java教程 7 ℃ 0 评论

首先,我得回忆一下常见的加密算法有哪些。对称加密的话,AES和DES是比较常用的,不过DES现在不太安全了,可能应该重点提AES。非对称加密的话,RSA应该是必须的,还有ECC可能也值得提一下。然后哈希算法,比如MD5、SHA-1、SHA-256这些,不过MD5和SHA-1已经被认为不够安全了,但可能还是有很多地方在用,所以需要说明情况。

接下来,每个算法需要说明用途、流程,然后给出Java代码示例。比如对于AES,需要生成密钥,加密和解密的步骤。Java中可以用Cipher类,密钥生成用KeyGenerator。要注意加密模式,比如CBC或者GCM,以及是否需要填充,比如PKCS5Padding。可能还要提到初始向量IV的使用,特别是在CBC模式下,需要将IV和密文一起传输。

京东大佬问我,常用的信息加密算法有哪些?举例说明其用法与流程

对于RSA,密钥对的生成是关键,使用KeyPairGenerator。加密用公钥,解密用私钥。同样使用Cipher类。需要注意RSA加密的数据长度限制,比如不能超过密钥长度减去一些填充字节,所以通常用来加密对称密钥,而不是大量数据。

哈希算法的话,比如SHA-256,使用MessageDigest类。流程是输入数据,生成摘要。MD5虽然不安全,但可能还是需要示例,但要提醒用户不要用于安全敏感的地方。

然后,用户可能需要的是代码示例的正确性和实用性。比如在AES示例中,是否需要处理IV,存储和传输IV。可能代码中需要将IV和密文拼接在一起,解密时分开读取。这样更符合实际应用场景。

还要考虑异常处理,比如在Java代码中可能需要处理NoSuchAlgorithmException、InvalidKeyException等异常,但示例代码可能为了简洁省略了try-catch块,但最好注明需要处理异常。

另外,用户可能想了解加密算法的分类,比如对称和非对称的区别,哈希算法的不可逆性。所以在解释的时候需要分门别类,结构清晰。

可能需要注意Java版本的不同,比如有些旧版本的Java可能不支持某些算法或密钥长度,但假设用户使用的是较新的Java版本,比如Java 8及以上。

最后,代码示例要确保能够运行,比如正确的类导入,正确的步骤。比如AES的密钥生成,加密和解密过程,Base64编码的使用,因为加密后的字节数组通常需要转换为Base64字符串以便传输或存储。

总结一下,我应该分三个部分:对称加密(AES)、非对称加密(RSA)、哈希算法(SHA-256),每个部分介绍用途、流程,然后给出Java代码示例,并解释代码的关键点。同时提醒一些安全注意事项,比如密钥管理、IV的使用、算法安全性等。

以下是常见的信息加密算法分类及Java实战代码示例:


一、对称加密算法(AES为例)

用途:加密大数据内容(如文件、消息)
特点:加密解密使用相同密钥,速度快
流程

  1. 生成AES密钥
  2. 设置加密模式(如CBC)和填充方式(如PKCS5Padding)
  3. 加密时生成随机IV(初始向量)
  4. 将IV与密文拼接存储
  5. 解密时分离IV和密文进行解密

Java代码

java

import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.Base64;
import java.security.SecureRandom;

public class AESExample {
    public static void main(String[] args) throws Exception {
        String plainText = "京东技术2023";
        
        // 1. 生成密钥
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256);
        SecretKey secretKey = keyGen.generateKey();
        
        // 2. 加密
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecureRandom random = new SecureRandom();
        byte[] iv = new byte[16];
        random.nextBytes(iv); // 生成随机IV
        
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));
        byte[] cipherText = cipher.doFinal(plainText.getBytes());
        
        // 拼接IV和密文(IV通常不保密)
        byte[] combined = new byte[iv.length + cipherText.length];
        System.arraycopy(iv, 0, combined, 0, iv.length);
        System.arraycopy(cipherText, 0, combined, iv.length, cipherText.length);
        System.out.println("密文:" + Base64.getEncoder().encodeToString(combined));
        
        // 3. 解密
        byte[] decoded = Base64.getDecoder().decode(combined);
        byte[] iv2 = new byte[16];
        System.arraycopy(decoded, 0, iv2, 0, iv2.length);
        
        cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv2));
        byte[] plainBytes = cipher.doFinal(decoded, iv2.length, decoded.length - iv2.length);
        System.out.println("原文:" + new String(plainBytes));
    }
}

二、非对称加密算法(RSA为例)

用途:密钥交换/数字签名
特点:公钥加密,私钥解密,安全性高但速度慢
流程

  1. 生成RSA密钥对
  2. 公钥加密数据
  3. 私钥解密数据

Java代码

java

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

public class RSAExample {
    public static void main(String[] args) throws Exception {
        String data = "敏感数据123";
        
        // 1. 生成密钥对
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048);
        KeyPair keyPair = keyGen.generateKeyPair();
        
        // 2. 公钥加密
        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
        byte[] cipherText = cipher.doFinal(data.getBytes());
        System.out.println("RSA密文:" + Base64.getEncoder().encodeToString(cipherText));
        
        // 3. 私钥解密
        cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
        byte[] decrypted = cipher.doFinal(cipherText);
        System.out.println("解密结果:" + new String(decrypted));
    }
}

三、哈希算法(SHA-256为例)

用途:数据完整性校验/密码存储
特点:不可逆,固定长度输出
流程

  1. 输入任意长度数据
  2. 生成固定长度的哈希值

Java代码

java

import java.security.MessageDigest;
import java.util.Base64;

public class HashExample {
    public static void main(String[] args) throws Exception {
        String input = "用户密码123";
        
        // 1. 创建MessageDigest实例
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        
        // 2. 计算哈希值
        byte[] hashBytes = md.digest(input.getBytes());
        
        // 3. 转换为十六进制字符串
        StringBuilder hexString = new StringBuilder();
        for (byte b : hashBytes) {
            hexString.append(String.format("%02x", b));
        }
        System.out.println("SHA-256哈希值:" + hexString);
        
        // 安全提示:实际存储密码应使用PBKDF2或bcrypt
    }
}

四、安全注意事项

  1. 密钥管理:对称密钥需安全存储(可使用KMS)
  2. 算法选择
  3. 避免使用DES(已不安全)、MD5/SHA1(易碰撞)
  4. 推荐使用AES-256、RSA-2048+、SHA-256/512
  5. 加密模式:优先选GCM(提供认证功能)模式
  6. 密码存储:必须加盐并使用慢哈希(如PBKDF2)

完整代码需处理异常(NoSuchAlgorithmException等),实际生产环境建议使用Bouncy Castle等专业加密库。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表