博客
关于我
安全架构-加密算法-对称加密
阅读量: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/

    你可能感兴趣的文章
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>
    Numix Core 开源项目教程
    查看>>
    numpy
    查看>>
    NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
    查看>>
    numpy 或 scipy 有哪些可能的计算可以返回 NaN?
    查看>>
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    numpy、cv2等操作图片基本操作
    查看>>
    numpy判断对应位置是否相等,all、any的使用
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>