python连接pgsql库对指定字段的参数加密

前言

为了能及时给客户交付,2023年2月13号凌晨四点多还在给客户打升级包的打工人

问题:今天要打包升级包给客户,由于我的原因,之前的版本的发件服务器邮箱密码我没有进行加密,用户已经使用了未加密的密码,如果升级的版本打包给客户,必定会出现解密失败的报错,所以我们需要在升级包里面写一个脚本进入数据库加密邮箱密码。

解决思路

  1. 通过python语言,连接数据库,查询第一条存储的邮箱数据
  2. 读取密码那一列,通过sm2对密码加密(这里要注意,因为我这里写的是py脚本,可是程序是java应用,所以加密的时候需要带上04,不然java那边解不出来)
  3. 将加密后的密码更新到表里

修改前:
在这里插入图片描述
修改后
在这里插入图片描述

代码

# !/usr/bin/python3
# -*- coding: utf-8 -*-
from gmssl import sm2
import psycopg2
# 数据库地址
host = ""
# 数据库名
database = ""
# 用户名
user = ""
#  密码
password = ""
# 数据库开放端口
port = 5432

PUBLIC_HEX_KEY = "公钥"
PRIVATE_HEX_KEY = "私钥"


class sm2Encrypt():
    def __init__(self):
        self.sm2_crypt = sm2.CryptSM2(public_key=PUBLIC_HEX_KEY, private_key=PRIVATE_HEX_KEY)

    # 加密
    def encrypt(self, info):
        encode_info = self.sm2_crypt.encrypt(info.encode("utf-8"))
        encode_info = bytes.hex(encode_info)
        return encode_info

    # 解密
    def decrypt(self, info):
        data = self.sm2_crypt.decrypt(bytes.fromhex(info)).decode()
        return data


def sqlUpdate():
    try:
        conn = psycopg2.connect(
            host=host,
            database=database,
            user=user,
            password=password,
            port=port
        )
        conn.autocommit = False
        cur = conn.cursor()
        # 读取第一条数据
        cur.execute("select* from sys_email_smtp  limit 1;")
        row = cur.fetchone()
        if row is not None:
            # 第一列就是邮箱密码email_password
            if row[7] is not None and row[7] is not '':
                sm = sm2Encrypt()
                try:
                    der = sm.decrypt(str(row[7][2:]))
                    print(der)
                except:
                    # 因为是java程序,所以sm2解密需要加上04
                    ss = "04" + sm.encrypt(row[7])
                    cur.execute(
                        "UPDATE sys_email_smtp SET email_password = '{}' WHERE id = {};".format(str(ss), row[0]))
                    conn.commit()
                    print("Data updated successfully.")

            else:
                print("Data does not meet the condition for update.")

    except Exception as e:
        conn.rollback()

        print("Transaction rolled back: {}".format(e))
        raise e
    finally:
        cur.close()
        conn.close()

if __name__ == '__main__':
    sqlUpdate()

本人csdn博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。

猜你喜欢

转载自blog.csdn.net/weixin_46654114/article/details/129039781