网站数据库中“密码加密”方法思考

本文探讨了MD5加密的安全性问题,并介绍了salt机制如何提高密码保护水平。通过客户端生成随机码结合用户密码进行加密,增强安全性。

博主,开始时候,写的web应用,数据库中的密码,都是直接保存的。真正的原汁原味,真正的所见即所得。

后来,看了别人的web应用都是MD5加密的,感觉很不错,自己也在应用中加入了MD5加密,貌似“不可逆”的,哈哈,看起来也专业了许多,后来听说优快云用户信息被黑客窃取了,自己也赶紧去换了密码。

今天,无意间看了http://howe.im/(探微·智在未来)的一篇博文《安全密码机制(salt机制)》,才知道了,单纯使用MD5加密,也是不安全的,这里简单说下,所读博文的内容和自己的一点认识吧。

    首先,解释下,为什么单纯MD5加密,是不安全的,我们暂且不论MD5是否可以由密文推出明文(有32位密文计算出加密前的密码),也不论用户的密码是否符合很高的安全性(加入大小写字母、数字、特殊字符等),当黑客窃取一个大型网站的数据库信息后,通过MD5加密(而非解密)方法,不断加密一些密码,如123abc,加密后A906449D5769FA7361D7ECC6AA3F6D28,在数据库中搜索,是否存在匹配密文,如果存在,则相应的用户密码就被破解了。不断的穷举密码,加密,匹配。这个速度是很快的,MD5加密很快,数据库匹配可以优化。

    然后,说下,博文中介绍的salt机制。

    1、用户注册时

    用户注册密码A、客户端生成一个随机码B,将两者组合到一起,然后MD5加密为C,将随机码B和加密后的C,两者分开提交到服务器,保存到数据库。

    2、用户登录时

    用户只需要提交密码,提交到服务器后,将密码和该用户数据库中保存的随机码组合,然后MD5加密,验证即可。

问题:这里有一个漏洞,那就是用户登录时,提交的密码,如果是明文,那么很容易被恶意获取。用户提交的信息是有必要加密的,这才是负责任的。

我看了另外一边博文,介绍了腾讯的朋友网,它是怎么加密提交信息的,这里简单说下。

    1、将用户密码A加密了三次B,然后与验证码字符C组合,然后进行一次MD5加密成密文D,提交到服务器,这里注意,提交是不包含验证码C的,因为验证码C是服务器生成,提前发送到Client端的。服务器端借助验证码C和用户提交来的密文D,获得密码,进行后续的验证。

这里又有一个问题了,说好的MD5,一般人是没法破解的呢,怎么这里有这个破解步骤呢,其实这是我臆想的步骤,可能它没有破解的,我为什么要破解的,我是想将这两部分整合,所以破解,如果朋友网,没有用salt的加密机制,那么就不需要获得密码A了,哈哈……说的很乱。

总之,可以采取的方案如下:

1、服务器端,用户注册时,保存 (随机码A) 和 (密码B+随机码A进行MD5加密)密文C

2、提交注册或登录信息时,客户端提交(密码M+验证码N进行可逆的方法加密)密文O,服务器端,保存有验证码N,故而,可以逆向运算获得密码M,然后提取数据库中的随机码A,组合后进行MD5加密,与数据库验证。注:虽然密文O是可逆的运算,但是,在提交过程中是不包括验证码N的,加上比较独特的加密算法,基本可以保证安全了,呵呵,除非,服务器端到用户端传输的报文也被截获了,那就没办法了。话说回来,就算获得了密码,那个注册时候生成的随机码A,也是很难获得的

软件特色:针对勒索病毒加密的SQL 数据库有特殊的修复算法,可匹配用友,金蝶数据库结构关系. 支持7.0、SQL2000、SQL2005、SQL2008、 SQL2008R2 、SQL2012、 SQL2014、 SQL2016; •SQL数据库修复软件操作简便; •可以修复数据库置疑状态; •可以修复数据库无法附加或附加报错; •可以修复数据表查询错误; •可以修复MDF文件损坏; •可以修复数据库备份文件损坏; •可以修复数据库被恢复后还是坏的; •可以修复一致性错误; •可以修复错误823; •可以修复输入数据有误; •可以修复运算溢出; •可以修复SQL数据库某些应用程序出错; •可以修复并行事务发生死锁; •支持数据库删除数据的恢复; •支持从日志LDF文件恢复删除的记录; 软件特色:针对勒索病毒加密的SQL 数据库有特殊的修复算法,可匹配用友,金蝶数据库结构关系. 支持7.0、SQL2000、SQL2005、SQL2008、 SQL2008R2 、SQL2012、 SQL2014、 SQL2016; •SQL数据库修复软件操作简便; •可以修复数据库置疑状态; •可以修复数据库无法附加或附加报错; •可以修复数据表查询错误; •可以修复MDF文件损坏; •可以修复数据库备份文件损坏; •可以修复数据库被恢复后还是坏的; •可以修复一致性错误; •可以修复错误823; •可以修复输入数据有误; •可以修复运算溢出; •可以修复SQL数据库某些应用程序出错; •可以修复并行事务发生死锁; •支持数据库删除数据的恢复; •支持从日志LDF文件恢复删除的记录;
<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管理密钥
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值