mysql给密码字段加密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql给密码字段加密相关的知识,希望对你有一定的参考价值。

用update table set password=password(password);可以给password这个字段已存在的数据加密,但是当新插进数据时就不会自动加密,怎样让新插入的密码也自动加密?

你用hibernate的话,一般情况下也会用struts2的,你可以在action里写一个MD5算法,人,在调用,如
/**
* @MD5加密算法
*/
public static String digestByMD5(String str) throws Exception
// 采用MD5加密算法,将任意长度字符串加密
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bts = md.digest(str.getBytes());
// 采用Base64算法,将加密后的字节变成字符串
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(bts);
参考技术A insert into tbname values(password('pwd'));---------新增的时候也可以用password函数转一下编码的追问

你好,我使用hibernate做的,这样恐怕不行吧

追答

那这个需要在入库之前就做好加密了,后台用md5对密码做加密算了,

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
转载说明:跟我说明,务必注明来源,附带本人博客连接。

以上是关于mysql给密码字段加密的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL数据库密码字段临时加密问题?

MySQL表中的密码字段类型问题

数据库如何实现字段加密

怎么实现对SQL Server数据库的字段进行加密和解密

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

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