MySQL敏感数据进行加密的几种方法

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691


  • 使用MySQL内置的加密函数

    • AES_ENCRYPT和AES_DECRYPT函数

      • 方法先容

        • AES(Advanced Encryption Standard)是一种对称加密算法。在MySQL中,可以使用AES_ENCRYPT函数对数据进行加密,使用AES_DECRYPT函数进行解密。这种加密方式的特点是加密息争密使用相同的密钥。

      • 示例

        • 首先,创建一个表来存储加密后的数据:
          1. CREATE TABLE encrypted_data (
          2.     id INT AUTO_INCREMENT PRIMARY KEY,
          3.     encrypted_text BLOB
          4. );
          复制代码
        • 然后,假设要加密的文本是'Sensitive Information',密钥是'MySecretKey',插入加密后的数据:
          1. SET @sensitive_text = 'Sensitive Information';
          2. SET @encryption_key = 'MySecretKey';
          3. INSERT INTO encrypted_data (encrypted_text)
          4. VALUES (AES_ENCRYPT(@sensitive_text, @encryption_key));
          复制代码
        • 当必要读取数据时,进行解密:
          1. SELECT AES_DECRYPT(encrypted_text, @encryption_key)
          2. FROM encrypted_data;
          复制代码


    • MD5函数(单向加密,用于验证)

      • 方法先容

        • MD5是一种单向加密哈希函数,它将任意长度的数据转换为固定长度(128位)的哈希值。由于它是单向的,无法从哈希值还原出原始数据。通常用于验证数据是否被窜改,比方存储用户密码的哈希值,在用户登录时比力输入密码的哈希值和存储的哈希值是否同等。

      • 示例

        • 假设存储用户密码,创建一个表:
          1. CREATE TABLE users (
          2.     id INT AUTO_INCREMENT PRIMARY KEY,
          3.     username VARCHAR(50),
          4.     password_hash VARCHAR(32)
          5. );
          复制代码
        • 当用户注册时,盘算密码的MD5哈希值并存储:
          1. SET @password = 'UserPassword';
          2. SET @password_hash = MD5(@password);
          3. INSERT INTO users (username, password_hash)
          4. VALUES ('User', @password_hash);
          复制代码
        • 在用户登录时,验证密码:
          1. SET @input_password = 'UserPassword';
          2. SET @stored_password_hash = (SELECT password_hash FROM users WHERE username = 'User');
          3. IF MD5(@input_password) = @stored_password_hash THEN
          4.     SELECT 'Password is correct';
          5. ELSE
          6.     SELECT 'Password is incorrect';
          7. END IF;
          复制代码
        • 必要留意的是,由于MD5存在碰撞等安全隐患,在安全性要求较高的场景下,现在更推荐使用如SHA - 256等更安全的哈希函数。



  • 使用透明数据加密(TDE)

    • 方法先容

      • TDE是一种在数据库层面提供的加密解决方案。它可以对整个数据库、表空间或者特定的表进行加密。MySQL企业版支持TDE,其原理是在数据写入磁盘时自动进行加密,在从磁盘读取数据时自动解密。这样可以在不改变应用程序对数据库访问方式的情况下,提供数据的安全性。TDE通常使用数据库服务器的密钥管理底子设施(KMI)来管理加密密钥。

    • 示例(以MySQL企业版为例)

      • 首先,必要在服务器上设置密钥管理,这通常涉及到安装和设置专门的密钥管理软件或者使用硬件安全模块(HSM)。
      • 假设要对一个数据库进行加密,在MySQL设置文件(my.cnf或my.ini)中添加如下设置:
        1. [mysqld]
        2. early-plugin - load = keyring_file.so
        3. keyring_file_data = /path/to/keyring/file
        复制代码
      • 重启MySQL服务后,使用CREATE TABLESPACE命令创建加密的表空间,比方:
        1. CREATE TABLESPACE encrypted_tablespace
        2. ADD DATAFILE 'encrypted_file.ibd'
        3. ENCRYPTION = 'Y'
        4. KEY_BLOCK_SIZE = 16;
        复制代码
      • 然后,可以在这个加密的表空间中创建表来存储加密后的数据。这样,存储在这个表空间中的数据在磁盘上就是加密的状态。


  • 应用层加密

    • 方法先容

      • 在应用程序层面进行加密,可以提供更灵活的加密方式。比方,使用编程语言(如Python、Java等)中的加密库对敏感数据进行加密后再存储到MySQL数据库中。这种方式可以更好地控制加密密钥的管理和加密算法的选择,同时也可以根据业务逻辑的必要进行更复杂的加密操纵。

    • 示例(以Python为例)

      • 假设使用cryptography库对数据进行加密,首先必要安装cryptography库(pip install cryptography)。
      • 示例代码如下:
        1. from cryptography.fernet import Fernet
        2. import mysql.connector
        3. # 生成密钥
        4. key = Fernet.generate_key()
        5. cipher_suite = Fernet(key)
        6. # 要加密的敏感数据
        7. sensitive_data = "Confidential Data".encode('utf - 8')
        8. encrypted_data = cipher_suite.encrypt(sensitive_data)
        9. # 连接到MySQL数据库
        10. mydb = mysql.connector.connect(
        11.     host="localhost",
        12.     user="your_user",
        13.     password="your_password",
        14.     database="your_database"
        15. )
        16. mycursor = mydb.cursor()
        17. # 创建表来存储加密数据
        18. mycursor.execute("CREATE TABLE if not exists encrypted_data (id INT AUTO_INCREMENT PRIMARY KEY, encrypted_text BLOB)")
        19. # 插入加密后的数据
        20. mycursor.execute("INSERT INTO encrypted_data (encrypted_text) VALUES (%s)", (encrypted_data,))
        21. mydb.commit()
        22. # 读取加密数据并解密
        23. mycursor.execute("SELECT encrypted_text FROM encrypted_data")
        24. result = mycursor.fetchone()
        25. decrypted_data = cipher_suite.decrypt(result[0]).decode('utf - 8')
        26. print(decrypted_data)
        复制代码
      • 在这个示例中,使用cryptography库中的Fernet类生成密钥并对数据进行加密。加密后的数据存储到MySQL数据库的表中,在读取数据时再进行解密。这种方式可以根据具体的应用场景灵活地处理加密息争密过程,而且可以结合其他安全措施,如密钥的安全存储和管理等。


欢迎关注公众号《小周的数据库进阶之路》,更多出色知识和干货尽在其中。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表