mysql中Base64编码与解码,aes_encrypt,aes_decrypt

实际开发过程中,我们可以使用Mysql的Base64编码与解码来保存加密数据。

第一种

这种方式是直接编码保存,这种方式只能保证数据库不是明文保存数据,加密作用不大。

插入密文数据

insert into tableName  ('name','password') values('杨家将', to_base64('12345')) ;

查询数据

--根据明文值查询--
select from_base64(password ) from tableName where password = to_base64('12345');
--根据密文值--
select from_base64(password ) from tableName where password = 'dddfdf34ED';

第二种

第二种方式是使用mysql的aes_encrypt函数加密,aes_decrypt函数解密。这种方式解密需要密匙,可以起到加密作用。
to_base64(AES_ENCRYPT(明文值,密钥))
AES_DECRYPT(from_base64(密文或者密文字段),密匙)

插入数据

// 13702111418为明文值,qwer为密匙
insert into tableName  ('name','password') values('杨家将', to_base64(AES_ENCRYPT('13702111418','qwer'))) ;

查询数据

--根据明文值查询--
select AES_DECRYPT(from_base64(password),'qwer') from tableName where password = to_base64(AES_ENCRYPT('13702111418','qwer'));
--根据密文值--
select AES_DECRYPT(from_base64(password),'qwer') from tableName where password = 'fdfet5445';

这里只介绍数据库查询的sql,保存数据和查询数据的代码业务逻辑我们下次再说。

欢迎大佬和java学习者加入扣扣群:344635699

<think>好的,我现在需要帮用户解决如何在Python中编写加密小程序并连接MySQL数据库存储加密数据的问题。首先,我得理清楚用户的需求。用户可能希望将敏感数据加密后存入数据库,确保数据安全。但用户可能对加密方法、如何集成到数据库操作中不太清楚,甚至可能对加密的必要步骤和最佳实践不太了解。 首先,我需要确定用户可能已经了解的方面。他们可能已经知道如何用Python连接MySQL,比如使用mysql-connector或pymysql。但加密部分可能是他们需要指导的地方。所以,我应该先介绍常用的加密库,比如hashlib用于哈希,cryptography用于对称加密,以及passlib处理密码哈希。 然后,用户可能需要具体的步骤,从安装库到建立数据库连接,再到设计数据表结构。比如,在数据库中,存储加密数据可能需要更大的字段,特别是IV(初始化向量)和盐值(salt)这些额外的数据。我需要提醒用户注意这些字段的设计,比如使用BLOB或VARCHAR(255)来存储二进制或Base64编码的数据。 接下来,用户可能关心如何在插入和查询数据时进行加密和解密。这里需要展示具体的代码示例,比如使用AES加密算法,如何生成密钥,处理加密后的数据,以及如何将二进制数据转换为可存储的字符串(如Base64编码)。同时,需要强调参数化查询的重要性,防止SQL注入,这点在之前的回答中已经提到过,但需要再次提醒。 另外,异常处理和资源管理也是关键。用户可能容易忘记关闭连接或处理加密过程中可能出现的错误,比如密钥错误或数据损坏。所以,在代码示例中加入try-except块,确保游标和连接被正确关闭,是必要的。 用户可能没有考虑到密钥管理的问题。存储加密密钥在代码中是不安全的,需要建议他们使用环境变量或密钥管理服务。这部分可能需要简要介绍,但用户可能还需要进一步指导,所以可以提到一些方法,如使用dotenv库加载环境变量。 同时,用户可能对不同的加密方法的应用场景不太清楚。比如,哈希适合存储密码,而对称加密适合需要解密的数据。需要解释这两种方法的区别,并给出相应的示例,帮助用户根据需求选择合适的方法。 在代码示例部分,需要确保每一步都有注释,说明代码的作用。比如,生成密钥、加密数据、存储到数据库、查询并解密的步骤。此外,处理二进制数据时,使用Base64编码可以避免数据库存储的问题,这部分需要详细说明。 最后,要总结关键注意事项,如密钥管理、加密算法选择、数据编码、访问控制等,确保用户了解整个流程中的安全要点。可能还需要提到使用ORM如SQLAlchemy来简化数据库操作,但根据用户的问题,主要焦点还是在加密和数据库连接上,所以这部分可以作为扩展建议。 在思考过程中,还要检查是否有遗漏的步骤,比如是否需要创建数据库表,示例中是否包含了创建表的SQL语句。此外,用户可能需要完整的示例代码,所以提供一个从连接到加密、存储、查询的完整流程是必要的。同时,要确保代码中的占位符(如数据库名、用户名、密码)被正确替换,避免用户直接复制代码时出现错误。 可能还需要提醒用户测试代码时的步骤,比如先创建数据库和表,再运行程序。此外,加密过程中的错误处理,比如密钥不一致导致的解密失败,应该被捕获并处理,避免程序崩溃。 总之,需要将整个流程分解为安装库、连接数据库、设计表结构、实现加密功能、数据存储查询、异常处理、密钥管理等部分,逐步引导用户完成一个安全的加密数据存储程序。</think>以下是将Python加密程序MySQL数据库结合使用的完整指南,包含安全存储加密数据的最佳实践: --- ### **一、核心组件选择** 1. **加密库推荐** - 哈希加密:`hashlib` (内置库) - 对称加密:`cryptography` (`pip install cryptography`) - 密码专用:`passlib` (`pip install passlib`) 2. **数据库驱动** ```bash pip install mysql-connector-python # 或 pip install pymysql ``` --- ### **二、数据库表设计建议** ```sql CREATE TABLE secure_data ( id INT PRIMARY KEY AUTO_INCREMENT, encrypted_data BLOB, -- 存储加密后的二进制数据 iv VARBINARY(16), -- AES加密所需的初始化向量 salt CHAR(32), -- 用于密码哈希的盐值 algorithm VARCHAR(50), -- 记录使用的加密算法 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- ### **三、加密存储实现步骤** #### **1. AES对称加密示例** ```python from cryptography.fernet import Fernet import base64 # 生成密钥(需安全存储) key = Fernet.generate_key() cipher = Fernet(key) # 加密数据 def encrypt_data(data: str) -> bytes: return cipher.encrypt(data.encode('utf-8')) # 解密数据 def decrypt_data(encrypted_data: bytes) -> str: return cipher.decrypt(encrypted_data).decode('utf-8') ``` #### **2. 数据库连接操作** ```python import mysql.connector from mysql.connector import Error def save_encrypted_data(data: str): try: conn = mysql.connector.connect( host="localhost", user="db_user", password="db_password", database="secure_db" ) cursor = conn.cursor() # 加密数据 encrypted = encrypt_data(data) # 存储加密结果 insert_query = """ INSERT INTO secure_data (encrypted_data, algorithm) VALUES (%s, 'AES-256') """ cursor.execute(insert_query, (encrypted,)) conn.commit() except Error as e: print(f"数据库错误: {e}") finally: if conn.is_connected(): cursor.close() conn.close() # 查询解密示例 def retrieve_data(record_id: int) -> str: try: conn = mysql.connector.connect(...) cursor = conn.cursor() cursor.execute(""" SELECT encrypted_data FROM secure_data WHERE id = %s """, (record_id,)) result = cursor.fetchone() if result: return decrypt_data(result[0]) except Error as e: print(f"解密失败: {e}") finally: # 关闭连接... ``` --- ### **四、安全增强措施** #### **1. 密码哈希存储(使用PBKDF2)** ```python from passlib.hash import pbkdf2_sha256 # 创建密码哈希 hash = pbkdf2_sha256.hash("user_password", rounds=100000) # 验证密码 def verify_password(input_pwd: str, stored_hash: str) -> bool: return pbkdf2_sha256.verify(input_pwd, stored_hash) ``` #### **2. 完整加密流程示例** ```python from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend import os def aes_encrypt(plaintext: str, key: bytes) -> tuple: iv = os.urandom(16) # 生成随机初始化向量 cipher = Cipher( algorithms.AES(key), modes.CBC(iv), backend=default_backend() ) encryptor = cipher.encryptor() # 填充数据到块大小的倍数 padder = padding.PKCS7(128).padder() padded_data = padder.update(plaintext.encode()) + padder.finalize() ciphertext = encryptor.update(padded_data) + encryptor.finalize() return (iv, ciphertext) # 存储时需要同时保存iv和ciphertext ``` --- ### **五、关键安全注意事项** 1. **密钥管理** - 绝对不要将密钥硬编码在代码中 - 使用环境变量存储: ```python import os key = os.environ.get('ENCRYPTION_KEY') ``` - 推荐使用密钥管理服务(如AWS KMS) 2. **数据编码建议** ```python # 存储前编码Base64 stored_data = base64.b64encode(encrypted_data).decode('utf-8') # 读取时解码 raw_data = base64.b64decode(database_value) ``` 3. **审计日志** ```sql ALTER TABLE secure_data ADD COLUMN modified_by VARCHAR(255) NOT NULL; ``` --- ### **六、完整工作流程** 1. 用户输入敏感数据 2. 生成随机盐值/IV 3. 使用加密算法处理数据 4. 将加密数据+元数据存储到MySQL 5. 查询时根据存储的元数据选择对应解密方式 6. 解密后仅在内存中使用数据 **扩展方案**:对于企业级应用,建议结合: - 数据库SSL连接加密 - 字段级加密(FLE) - 使用HashiCorp Vault管理密钥
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值