博客
关于我
安全架构-加密算法-对称加密
阅读量:684 次
发布时间:2019-03-17

本文共 4141 字,大约阅读时间需要 13 分钟。

安全架构 - 加密算法 - 对称加密

加密的重要性

在之前的安全架构文章中,我们探讨了api接口签名防止数据篡改的方法。然而,关键数据在传输过程中仍然不能以明文形式存在。这引出了另一个重要的安全问题:数据加密传输。加密算法的任务就是确保数据在传输过程中无法被恶意读取。

加密算法分类

加密算法根据密钥的类型可分为对称加密与非对称加密两大类。

  • 对称加密:使用相同的密钥进行加密与解密,属于最常见的加密方式。
  • 非对称加密:加密与解密使用不同的密钥,例如使用公钥加密、私钥解密。非对称加密会在后续文章中详细讨论。

本文将重点介绍对称加密的概念、特点、常用算法以及实际应用建议。

对称加密的特点

  • 算法公开:对称加密算法通常为公开标准,如AES、 DES等,开发者可以直接使用其实现。
  • 计算效率高:加密解密运算复杂度较低,对大规模数据加密传输支持能力强。
  • 密钥管理需求高:使用对称加密需要双方共享相同的密钥,密钥的生成与分发成为关键环节。

然而,密钥管理也带来了挑战。尤其在企业环境中,若 userInfo 数量较多,密钥的生成和分发工作将变得复杂,甚至可能导致安全问题的出现。

常见对称加密算法

  • Data Encryption Standard (DES):作为历史上最早的标准加密算法,尤其适用于对大量数据进行加密。
  • 3DES(Triple DES):通过三次 DES 加密,显著提升了加密强度。
  • AES(Advanced Encryption Standard):作为当前主流的对称加密标准,速度快、安全性高等特点使其成为普遍选择。

加密填充模式

加密填充模式决定了数据加密的具体实现方式,常见模式包括:

  • ECB(Electronic Code Book,电子密码本模式):最基本的加密模式,无初始化向量,容易受到密码本重放攻击。
  • CBC(Cipher Block Chaining, 密码分组链接模式):使用初始向量和前一个密文块的异或结果作为当前明文块的加密载体,目前应用最广泛。
  • CFB(Cipher Feedback Mode, 加密反馈模式):利用同步字节序列生成密文流,同时将密文反馈至加密算法,确保每个字节加密的完整性。
  • OFB(Output Feedback Mode, 输出反馈模式):类似于CFB,但使用前一个密文输出生成反馈序列,避免了数据错误的扩散。
  • 选择合适的填充模式需要根据具体应用要求进行权衡,如是否需要支持冗余纠正(如CRC校验)以及错误传播特性。

    加密算法的选择与应用

    • 数据量大时:选择对称加密算法,能够显著提升加密解密速度。
    • 签名需求时:对称加密无法提供签名功能,因此需要结合非对称加密算法配合使用。
    • 密钥管理复杂时:对称加密需要高效的密钥分发方案,特别是在分布式系统和大规模用户场景中需要谨慎使用。

    在实际应用中,可以结合两种加密方式的优点:使用非对称加密算法进行密钥管理,同时用对称加密算法加密数据,实现既高效加密传输,又便于密钥管理。

    加密算法的实现示例

    以下是对某些加密算法的实现示例:

    .NET 示例:使用 DES 加密

    using System.IO;using System.Text;using System.Security.Cryptography;public class DESexample{    public static string Encrypt(string source, string key)    {        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();        provider.Key = Encoding.ASCII.GetBytes(key);        provider.IV = Encoding.ASCII.GetBytes(key);        byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(source);        MemoryStream stream = new MemoryStream();        CryptoStream crypto = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);        crypto.Write(bytes, 0, bytes.Length);        crypto.FlushFinalBlock();        StringBuilder sb = new StringBuilder();        foreach (byte b in stream.ToArray())            sb.Append(Convert.ToString(b, "X2"));        return sb.ToString();    }    public static string Decrypt(string cipherText, string key)    {        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();        provider.Key = Encoding.ASCII.GetBytes(key);        provider.IV = Encoding.ASCII.GetBytes(key);        byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(cipherText);        MemoryStream stream = new MemoryStream();        CryptoStream cryptoStream = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Read);        byte[] decryptedBytes = new byte[cryptoStream.LoadBytesAsync().Length];        for (int i = 0; i < decryptedBytes.Length; i++)        {            var c = cryptoStream.ReadByte();            if (c == -1)                break;            decryptedBytes[i] = c;        }        string decrypted = Encoding.GetEncoding("gb2312")..GetString(decryptedBytes);        return decrypted;    }}

    JAVA 示例:使用 AES 加密

    import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Base64;public class AESTutorial {    public static void main(String[] args) throws Exception {        String plaintext = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";        // Generate AES key        byte[] key = new byte[16];        MessageDigest md = MessageDigest.getInstance("AES");        md.update("your-secure-password".getBytes());        byte[] keyBytes = md.digest();        md = MessageDigest.getInstance("AES");        byte[] ivBytes = md.digest();        // Create AES Cipher        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");        SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES");        cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivBytes));        byte[] cipherBytes = cipher.doFinal(plaintext.getBytes());        // Base64 encode for transcription        System.out.println(Base64.encodeToString(cipherBytes));    }}

    总结

    对称加密算法在加密传输中发挥着关键作用,其优势体现在加密解密速度快、适用于大规模数据传输等方面。选择合适的加密算法和填充模式,结合密钥管理方案,是保障数据安全的重要环节。

    转载地址:http://loshz.baihongyu.com/

    你可能感兴趣的文章
    npm install 报错 no such file or directory 的解决方法
    查看>>
    npm install 权限问题
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>
    npm install的--save和--save-dev使用说明
    查看>>
    npm node pm2相关问题
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>
    npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    查看>>
    npm scripts 使用指南
    查看>>
    npm should be run outside of the node repl, in your normal shell
    查看>>
    npm start运行了什么
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>
    npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
    查看>>
    npm—小记
    查看>>
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>