MST

星途 面试题库

面试题:Java网络编程中如何使用对称加密算法进行数据加密

在Java网络编程场景下,假设要传输用户登录密码信息,简述如何使用AES这种对称加密算法对密码进行加密,包括密钥的生成、加密和解密的基本代码实现步骤。
41.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 密钥生成
    • 在Java中,使用KeyGenerator生成AES密钥。示例代码如下:
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import java.security.NoSuchAlgorithmException;
    
    public class AESKeyGenerator {
        public static SecretKey generateAESKey() throws NoSuchAlgorithmException {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(256); // 建议使用256位密钥
            return keyGenerator.generateKey();
        }
    }
    
  2. 加密实现
    • 使用Cipher类进行加密操作。示例代码如下:
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.security.SecureRandom;
    import java.util.Base64;
    
    public class AESEncryption {
        public static String encrypt(String password, SecretKey secretKey) throws Exception {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            byte[] iv = new byte[16];
            SecureRandom secureRandom = new SecureRandom();
            secureRandom.nextBytes(iv);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
            byte[] encrypted = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8));
            byte[] encryptedIVAndText = new byte[iv.length + encrypted.length];
            System.arraycopy(iv, 0, encryptedIVAndText, 0, iv.length);
            System.arraycopy(encrypted, 0, encryptedIVAndText, iv.length, encrypted.length);
            return Base64.getEncoder().encodeToString(encryptedIVAndText);
        }
    }
    
  3. 解密实现
    • 使用Cipher类进行解密操作。示例代码如下:
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
    
    public class AESDecryption {
        public static String decrypt(String encryptedPassword, SecretKey secretKey) throws Exception {
            byte[] decoded = Base64.getDecoder().decode(encryptedPassword);
            int ivSize = 16;
            byte[] iv = new byte[ivSize];
            System.arraycopy(decoded, 0, iv, 0, ivSize);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
            byte[] encrypted = new byte[decoded.length - ivSize];
            System.arraycopy(decoded, ivSize, encrypted, 0, encrypted.length);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
            byte[] decrypted = cipher.doFinal(encrypted);
            return new String(decrypted, StandardCharsets.UTF_8);
        }
    }
    

在实际的Java网络编程场景中使用时,要注意密钥的安全存储和传输。可以通过安全通道如SSL/TLS来传输密钥,同时密钥应妥善保管,例如存储在安全的密钥管理系统(KMS)中。