面试题答案
一键面试常用对称加密算法
- DES(Data Encryption Standard):是一种分组加密算法,使用56位密钥,将64位的数据块加密成64位的密文。虽然曾经广泛使用,但由于密钥长度较短,在现代计算能力下安全性已不足。
- 3DES(Triple Data Encryption Standard):是DES的改进版本,通过多次使用DES算法来提高安全性。通常使用三个不同的密钥对数据进行三次加密,有效密钥长度达到112位或168位。
- AES(Advanced Encryption Standard):是目前最常用的对称加密算法,取代了DES。它支持128位、192位和256位密钥长度,具有较高的安全性和性能。AES算法具有良好的雪崩效应,即明文或密钥的微小改变会导致密文的巨大变化。
使用AES在后端开发中对Redis缓存数据加密解密(Python示例)
- 安装依赖:
pip install pycryptodome redis
- 加密和解密代码:
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的连接配置等。