Python中使用Crypto.Cipher.Blowfish算法加密和解密数据库中的数据的方法
发布时间:2024-01-06 16:31:56
在Python中,可以使用pycryptodomex库来实现Blowfish算法的加密和解密。下面是一个简单的使用例子:
首先,我们需要安装pycryptodomex库。可以使用以下命令进行安装:
pip install pycryptodomex
接下来,我们可以使用以下代码来创建一个BlowfishCipher类来实现加密和解密操作:
from Crypto.Cipher import Blowfish
from Crypto import Random
import base64
class BlowfishCipher:
def __init__(self, key):
self.key = key
self.block_size = Blowfish.block_size
def pad(self, data):
padding_len = self.block_size - (len(data) % self.block_size)
padding = chr(padding_len) * padding_len
return data + padding
def unpad(self, data):
padding_len = ord(data[-1])
return data[:-padding_len]
def encrypt(self, data):
data = self.pad(data)
iv = Random.new().read(self.block_size)
cipher = Blowfish.new(self.key, Blowfish.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(data)).decode('utf-8')
def decrypt(self, data):
data = base64.b64decode(data)
iv = data[:self.block_size]
cipher = Blowfish.new(self.key, Blowfish.MODE_CBC, iv)
return self.unpad(cipher.decrypt(data[self.block_size:])).decode('utf-8')
使用上述类的方法来加密和解密数据库中的数据,可以使用以下代码示例:
import sqlite3
key = b'mykey'
blowfish = BlowfishCipher(key)
def encrypt_data(data):
return blowfish.encrypt(data)
def decrypt_data(data):
return blowfish.decrypt(data)
# 连接到数据库
conn = sqlite3.connect('mydatabase.db')
c = conn.cursor()
# 创建表格
c.execute('''CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name TEXT, email TEXT)''')
# 插入数据
encrypted_name = encrypt_data('John Doe')
encrypted_email = encrypt_data('john.doe@example.com')
c.execute('''INSERT INTO users (id, name, email) VALUES (?, ?, ?)''', (1, encrypted_name, encrypted_email))
# 查询数据
c.execute('''SELECT * FROM users WHERE id = ?''', (1,))
row = c.fetchone()
decrypted_name = decrypt_data(row[1])
decrypted_email = decrypt_data(row[2])
print(decrypted_name) # 输出: John Doe
print(decrypted_email) # 输出: john.doe@example.com
# 关闭连接
conn.close()
以上示例中,我们创建了一个users表格,其中的name和email字段的值被加密后插入到数据库中。然后我们使用相同的密钥对数据进行解密,并打印出解密后的结果。
需要注意的是,在实际应用中,应该将密钥保存在一个安全的地方,并且在加密和解密数据时使用相同的密钥。此外,还应该考虑对数据库的访问进行安全控制,以防止未经授权的访问。
