MST

星途 面试题库

面试题:缓存设计之持久化缓存数据加密基础

在持久化缓存中,常用的对称加密算法有哪些?请简述如何在后端开发中应用其中一种算法对缓存数据进行加密和解密,假设使用Python语言,且缓存使用Redis。
38.5万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

常用对称加密算法

  1. DES(Data Encryption Standard):是一种分组加密算法,使用56位密钥,将64位的数据块加密成64位的密文。虽然曾经广泛使用,但由于密钥长度较短,在现代计算能力下安全性已不足。
  2. 3DES(Triple Data Encryption Standard):是DES的改进版本,通过多次使用DES算法来提高安全性。通常使用三个不同的密钥对数据进行三次加密,有效密钥长度达到112位或168位。
  3. AES(Advanced Encryption Standard):是目前最常用的对称加密算法,取代了DES。它支持128位、192位和256位密钥长度,具有较高的安全性和性能。AES算法具有良好的雪崩效应,即明文或密钥的微小改变会导致密文的巨大变化。

使用AES在后端开发中对Redis缓存数据加密解密(Python示例)

  1. 安装依赖
    pip install pycryptodome redis
    
  2. 加密和解密代码
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad
    import redis
    import base64
    
    
    def encrypt_data(data, key):
        cipher = AES.new(key.encode('utf - 8'), AES.MODE_CBC)
        padded_data = pad(data.encode('utf - 8'), AES.block_size)
        encrypted_data = cipher.encrypt(padded_data)
        iv = base64.b64encode(cipher.iv).decode('utf - 8')
        encrypted = base64.b64encode(encrypted_data).decode('utf - 8')
        return iv + ':' + encrypted
    
    
    def decrypt_data(encrypted_data, key):
        iv, encrypted = encrypted_data.split(':', 1)
        iv = base64.b64decode(iv)
        encrypted = base64.b64decode(encrypted)
        cipher = AES.new(key.encode('utf - 8'), AES.MODE_CBC, iv)
        decrypted_data = unpad(cipher.decrypt(encrypted), AES.block_size)
        return decrypted_data.decode('utf - 8')
    
    
    def set_redis_cache(key, value, redis_client, encryption_key):
        encrypted_value = encrypt_data(value, encryption_key)
        redis_client.set(key, encrypted_value)
    
    
    def get_redis_cache(key, redis_client, encryption_key):
        encrypted_value = redis_client.get(key)
        if encrypted_value:
            return decrypt_data(encrypted_value.decode('utf - 8'), encryption_key)
        return None
    
    
    if __name__ == '__main__':
        r = redis.Redis(host='localhost', port=6379, db = 0)
        encryption_key = "mysecretkey12345"
        data_to_cache = "Hello, Redis with Encryption"
        set_redis_cache('my_key', data_to_cache, r, encryption_key)
        retrieved_data = get_redis_cache('my_key', r, encryption_key)
        print(retrieved_data)
    

在上述代码中:

  • encrypt_data函数使用AES算法的CBC模式对数据进行加密,并将初始化向量(IV)和加密后的数据进行编码并拼接返回。
  • decrypt_data函数将接收到的加密数据拆分出IV和密文,进行解码后使用AES解密得到原始数据。
  • set_redis_cache函数负责将加密后的数据存入Redis。
  • get_redis_cache函数从Redis获取加密数据并解密返回。

注意,在实际应用中,密钥encryption_key应该妥善保管,最好使用更安全的密钥管理方式,并且根据需求调整Redis的连接配置等。