常见加密算法及应用
常用加密算法对比与应用场景加密算法是信息安全的基础根据其技术原理和用途主要分为三大类信息摘要算法哈希算法、对称加密算法和非对称加密算法。下表对这三大类中的常用算法进行了核心对比算法类型算法名称核心特点主要应用场景安全性/备注信息摘要算法MD5输出128位散列值计算速度快但已存在严重碰撞漏洞不再安全。文件完整性校验非敏感场景、旧系统数据校验。已不推荐用于安全目的仅可用于非安全校验。SHA-1输出160位散列值安全性高于MD5但已被证明可被碰撞攻击。软件发布签名逐步被淘汰、旧版Git提交ID。安全性已不足应迁移至SHA-2系列。SHA-256/SHA-512SHA-2系列成员输出长度分别为256位和512位目前安全。数字签名、SSL/TLS证书、区块链比特币、密码存储加盐后。目前行业标准广泛应用于高安全需求场景。对称加密算法DES密钥长度56位分组长度64位已可被暴力破解。历史遗留系统、教学演示。已完全被破解严禁在新系统中使用。3DES对DES进行三次加密密钥长度有效提升至112或168位速度慢。金融支付系统如POS机的旧标准、向后兼容场景。仍在使用但正被淘汰AES是更优替代。AES密钥长度支持128、192、256位安全高效为当前国际标准。无线通信加密Wi-Fi、文件系统加密、SSL/TLS、数据库字段加密。最主流的对称加密算法兼顾安全与性能。非对称加密算法RSA基于大数分解难题支持加密和数字签名密钥长度通常为2048位以上。SSL/TSSL/TLS握手、数字证书、软件签名、安全邮件PGP。计算开销大常用于交换对称密钥或签名而非加密大量数据。ECC基于椭圆曲线离散对数难题在相同安全强度下密钥长度远小于RSA。移动设备加密、物联网IoT、区块链以太坊、资源受限环境。效率高于RSA是未来发展趋势尤其适合移动端。核心原理与Java代码示例1. 信息摘要算法哈希算法此类算法将任意长度的输入映射为固定长度的输出哈希值具有单向性不可逆和抗碰撞性难以找到两个不同输入得到相同输出。主要用于验证数据完整性而非加密数据本身。Java示例使用SHA-256计算文件摘要import java.nio.file.Files; import java.nio.file.Paths; import java.security.MessageDigest; public class HashExample { public static void main(String[] args) throws Exception { // 1. 创建MessageDigest实例指定算法为SHA-256 MessageDigest digest MessageDigest.getInstance(SHA-256); // 2. 读取文件内容 byte[] fileBytes Files.readAllBytes(Paths.get(example.txt)); // 3. 计算摘要 byte[] hashBytes digest.digest(fileBytes); // 4. 将字节数组转换为十六进制字符串表示 StringBuilder hexString new StringBuilder(); for (byte b : hashBytes) { String hex Integer.toHexString(0xff b); if (hex.length() 1) hexString.append(0); hexString.append(hex); } System.out.println(SHA-256 Hash: hexString.toString()); // 输出示例a1b2c3d4e5f6... (64位十六进制字符串) } }2. 对称加密算法加密和解密使用同一把密钥加解密速度快适合处理大量数据。核心挑战在于密钥的安全分发与管理。Java示例使用AES进行加密和解密import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.GCMParameterSpec; import java.util.Base64; public class AESExample { public static void main(String[] args) throws Exception { String plainText 这是一段需要加密的敏感数据。; // 1. 生成AES密钥256位 KeyGenerator keyGen KeyGenerator.getInstance(AES); keyGen.init(256); SecretKey secretKey keyGen.generateKey(); // 2. 生成随机初始化向量IV用于CBC或GCM模式 byte[] iv new byte[12]; // GCM推荐12字节 new java.security.SecureRandom().nextBytes(iv); // 3. 加密 Cipher cipher Cipher.getInstance(AES/GCM/NoPadding); GCMParameterSpec gcmSpec new GCMParameterSpec(128, iv); // 128位认证标签 cipher.init(Cipher.ENCRYPT_MODE, secretKey, gcmSpec); byte[] cipherText cipher.doFinal(plainText.getBytes(UTF-8)); // 将IV和密文一起存储或传输 byte[] encryptedData new byte[iv.length cipherText.length]; System.arraycopy(iv, 0, encryptedData, 0, iv.length); System.arraycopy(cipherText, 0, encryptedData, iv.length, cipherText.length); String encodedData Base64.getEncoder().encodeToString(encryptedData); System.out.println(加密后 (Base64): encodedData); // 4. 解密模拟接收方 byte[] decodedData Base64.getDecoder().decode(encodedData); byte[] receivedIv new byte[12]; byte[] receivedCipherText new byte[decodedData.length - 12]; System.arraycopy(decodedData, 0, receivedIv, 0, 12); System.arraycopy(decodedData, 12, receivedCipherText, 0, receivedCipherText.length); cipher.init(Cipher.DECRYPT_MODE, secretKey, new GCMParameterSpec(128, receivedIv)); byte[] decryptedBytes cipher.doFinal(receivedCipherText); String decryptedText new String(decryptedBytes, UTF-8); System.out.println(解密后: decryptedText); } }3. 非对称加密算法使用公钥和私钥配对。公钥可公开用于加密或验证签名私钥必须保密用于解密或生成签名。解决了对称加密的密钥分发问题但计算速度慢。Java示例使用RSA进行密钥交换与数字签名import javax.crypto.Cipher; import java.security.*; import java.util.Base64; public class RSAExample { public static void main(String[] args) throws Exception { String data 重要交易数据; // 1. 生成RSA密钥对2048位 KeyPairGenerator keyPairGen KeyPairGenerator.getInstance(RSA); keyPairGen.initialize(2048); KeyPair keyPair keyPairGen.generateKeyPair(); PublicKey publicKey keyPair.getPublic(); PrivateKey privateKey keyPair.getPrivate(); // **场景一加密小数据如对称密钥** Cipher cipher Cipher.getInstance(RSA/ECB/OAEPWithSHA-256AndMGF1Padding); cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 假设这是一个AES密钥 String aesKey MySecretAESKey123; byte[] encryptedKey cipher.doFinal(aesKey.getBytes(UTF-8)); System.out.println(加密后的对称密钥 (Base64): Base64.getEncoder().encodeToString(encryptedKey)); // **场景二数字签名验证数据完整性与来源** // 发送方用私钥签名 Signature signer Signature.getInstance(SHA256withRSA); signer.initSign(privateKey); signer.update(data.getBytes(UTF-8)); byte[] digitalSignature signer.sign(); String encodedSignature Base64.getEncoder().encodeToString(digitalSignature); System.out.println(数字签名 (Base64): encodedSignature); // 接收方用公钥验签 Signature verifier Signature.getInstance(SHA256withRSA); verifier.initVerify(publicKey); verifier.update(data.getBytes(UTF-8)); boolean isSignatureValid verifier.verify(Base64.getDecoder().decode(encodedSignature)); System.out.println(签名验证结果: (isSignatureValid ? 通过数据完整且来源可信 : 失败数据可能被篡改)); } }综合应用场景分析HTTPSSSL/TLS协议综合运用了上述所有算法。握手阶段客户端使用服务器的RSA公钥来自证书加密一个随机生成的对称密钥如AES密钥并发送给服务器建立安全信道。通信阶段双方使用协商好的对称密钥AES对传输的应用层数据进行加密和解密保证效率。完整性校验使用SHA-256等哈希算法计算消息的摘要并结合RSA签名确保数据在传输中未被篡改。密码存储不应直接存储明文密码。正确做法是使用加盐的SHA-256等强哈希算法。盐值Salt是一个随机字符串与密码拼接后再哈希并将盐值和哈希值一同存入数据库可有效抵御彩虹表攻击。数字证书与签名软件发布者使用私钥对软件包的SHA-256哈希值进行RSA签名。用户下载后使用发布者公开的公钥验证签名从而确认软件来源可信且未被篡改。物联网安全由于设备资源受限ECC算法因其短密钥高强度的特性比RSA更适合用于设备身份认证和建立安全连接。参考来源常用加密算法及其应用场景介绍PPT截图详解Java实现的三种常用加密算法及其应用场景常用的加密算法介绍及其应用场景—MD5、SHA1、AES、DES、3DES、RSA、ECC几种常用加密算法比较几种常用加密算法比较几种常用加密算法比较