达梦密码策略参数PWD_POLICY详解

本文详细介绍了达梦数据库系统的PWD_POLICY参数及其对密码策略的影响,包括口令长度、字符类型和兼容模式。通过实例展示了如何创建用户并调整密码策略,如设置口令最小长度和禁用特定策略。还探讨了PWD_MIN_LEN参数在不同策略下的作用。总结了参数设置与用户创建的关系,并推荐访问达梦技术社区获取更多信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看系统管理员手册中该参数解释:
PWD_POLICY 设置系统默认口令策略 默认值为2 动态,系统级参数
0:无策略
1:禁止与用户名相同
2:口令长度不小于9
4:至少包含1个大写字母(A-Z)
8: 至少包含1个数字(0-9)
16:至少包含1个标点符号(在英文输入法状态下,除"和空格外的所有符号)
若为其他数字,则表示配置值的和,如3=1+2,表示同时启用第1项和第2项策略。
当参数COMPATIBLE_MODE=1(等于1表示兼容SQL92标准)时,PWD_POLICY的实际值均为0

该参数没有包含在dm.ini文件中,但可调用系统过程 SP_SET_PARA_VALUE() 设置

通过SQL查看该参数值:

SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME = ‘PWD_POLICY’;
在这里插入图片描述

SELECT *
FROM V$DM_INI
WHERE PARA_NAME = ‘PWD_POLICY’;
在这里插入图片描述
目前密码策略是 2:口令长度不小于9
– 创建用户,设定6位的密码,报错
CREATE USER TEST1 IDENTIFIED BY Dameng;
在这里插入图片描述
– 设定9位的密码
CREATE USER TEST1 IDENTIFIED BY Dameng666;
在这里插入图片描述

修改密码策略为31 即31=1+2+4+8+16,包含了所有密码策略
SP_SET_PARA_VALUE(1,‘PWD_POLICY’,31);

– 创建用户, 设定符合策略的密码
CREATE USER TEST2 IDENTIFIED BY “A1,dameng_2345”;
在这里插入图片描述

参数PWD_MIN_LEN 设置用户口令的最小长度,取值范围(9~48)。默认值9。
修改PWD_MIN_LEN参数值为15
SP_SET_PARA_VALUE(1,‘PWD_MIN_LEN’,15);

– 创建用户,依旧设置14位密码,报错
CREATE USER TEST3 IDENTIFIED BY “A1,dameng_2345”;
在这里插入图片描述

– 设置15位密码
CREATE USER TEST3 IDENTIFIED BY “A1,dameng_23459”;
在这里插入图片描述

修改密码策略为1 禁止与用户名相同
SP_SET_PARA_VALUE(1,‘PWD_POLICY’,1);

–创建用户TEST4,指定密码为TEST4,报错
在这里插入图片描述

–指定密码为小写/大小写组合等,依旧报错
在这里插入图片描述

–指定密码为包含TEST4的字符串,成功(密码策略1,设置的PWD_MIN_LEN为15没生效,密码长度小于15)
在这里插入图片描述

– 当前密码策略为1,修改PWD_MIN_LEN为10,成功
SP_SET_PARA_VALUE(1,‘PWD_MIN_LEN’,10);
在这里插入图片描述

修改密码策略为3,3=1+2。
SP_SET_PARA_VALUE(1,‘PWD_POLICY’,3);
– 创建用户TEST5,指定9位长度密码,失败
在这里插入图片描述

– 创建用户TEST5,指定10位长度密码,成功
在这里插入图片描述

心得:参数 PWD_MIN_LEN 设置的值是在PWD_POLICY=2或值包含2时,生效

更多资讯请上达梦技术社区了解:https://eco.dameng.com

根据需求,需要对给出的部分代码进行完善和优化,以下是一个可能的实现方案: 1. 在代码开头,定义常量和变量,用于存储密码数据的地址、有效性标志和日期时间等信息: ```c #define ADDR_SETTING_LED_PWD_DATETIME 0x8000 // 密码数据的存储地址,假设为0x8000 #define EEPROM_SETTING_LED_PWD_SIZE 70 // 密码数据总大小,假设为70字节 uint8_t pwd_valid_flag = 0xA5; // 密码有效性标志 uint8_t pwd_valid_flag_clear = 0x00; // 密码有效性标志清零值 uint8_t pwd_last_valid; // 上一个密码数据的有效性标志 uint8_t pwd_last_group = 0; // 上一个密码数据所在的组号,初始为0 uint16_t pwd_valid_address = ADDR_SETTING_LED_PWD_DATETIME + EEPROM_SETTING_LED_PWD_SIZE - 7; // 上一个密码数据的地址,初始为最后一个组的起始地址 uint8_t abTime[6]; // 当前时间,用于更新密码数据的日期时间信息 uint8_t abTime2[6]; // 读取到的密码数据的日期时间信息,用于检查写入是否成功 ``` 2. 在一个循环中轮询密码数据,找到上一个有效的密码数据的组号和地址,并清除其有效性标志: ```c for (int i = 1; i <= 10; i++) { Setting_Led_Get_Pwd_LastValid(pwd_valid_address, &pwd_last_valid); if (i == 10) { pwd_last_group = 0; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7), &pwd_valid_flag); break; } if (pwd_last_valid == pwd_valid_flag) { pwd_last_group = 10 - i; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7), &pwd_valid_flag_clear); break; } pwd_valid_address -= 7; } ``` 3. 更新密码数据的日期时间信息,写入有效性标志和日期时间到下一个组: ```c abTime[0] = g_stcPanel.stcRTCGet.Year; abTime[1] = g_stcPanel.stcRTCGet.Month; abTime[2] = g_stcPanel.stcRTCGet.Day; abTime[3] = g_stcPanel.stcRTCGet.Hour; abTime[4] = g_stcPanel.stcRTCGet.Minute; abTime[5] = g_stcPanel.stcRTCGet.Second; Setting_Led_Set_Pwd_DateTime(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 7 + 1, abTime); Setting_Led_Get_Pwd_DateTime(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 1, abTime2); pwd_last_group = (pwd_last_group + 1) % 10; // 更新上一个密码数据所在的组号为下一个组 Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7), &pwd_valid_flag); ``` 4. 重复上述过程,直到所有的密码数据都被写入: ```c for (int i = 1; i <= 9; i++) { pwd_valid_address -= 7; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 7, &pwd_valid_flag_clear); abTime[0] = 0; abTime[1] = 0; abTime[2] = 0; abTime[3] = 0; abTime[4] = 0; abTime[5] = 0; Setting_Led_Set_Pwd_DateTime(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 7 + 1, abTime); Setting_Led_Get_Pwd_DateTime(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 1, abTime2); pwd_last_group = (pwd_last_group + 1) % 10; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7), &pwd_valid_flag); } ``` 完整的代码如下所示: ```c #define ADDR_SETTING_LED_PWD_DATETIME 0x8000 // 密码数据的存储地址,假设为0x8000 #define EEPROM_SETTING_LED_PWD_SIZE 70 // 密码数据总大小,假设为70字节 uint8_t pwd_valid_flag = 0xA5; // 密码有效性标志 uint8_t pwd_valid_flag_clear = 0x00; // 密码有效性标志清零值 uint8_t pwd_last_valid; // 上一个密码数据的有效性标志 uint8_t pwd_last_group = 0; // 上一个密码数据所在的组号,初始为0 uint16_t pwd_valid_address = ADDR_SETTING_LED_PWD_DATETIME + EEPROM_SETTING_LED_PWD_SIZE - 7; // 上一个密码数据的地址,初始为最后一个组的起始地址 uint8_t abTime[6]; // 当前时间,用于更新密码数据的日期时间信息 uint8_t abTime2[6]; // 读取到的密码数据的日期时间信息,用于检查写入是否成功 for (int i = 1; i <= 10; i++) { Setting_Led_Get_Pwd_LastValid(pwd_valid_address, &pwd_last_valid); if (i == 10) { pwd_last_group = 0; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7), &pwd_valid_flag); break; } if (pwd_last_valid == pwd_valid_flag) { pwd_last_group = 10 - i; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7), &pwd_valid_flag_clear); break; } pwd_valid_address -= 7; } abTime[0] = g_stcPanel.stcRTCGet.Year; abTime[1] = g_stcPanel.stcRTCGet.Month; abTime[2] = g_stcPanel.stcRTCGet.Day; abTime[3] = g_stcPanel.stcRTCGet.Hour; abTime[4] = g_stcPanel.stcRTCGet.Minute; abTime[5] = g_stcPanel.stcRTCGet.Second; Setting_Led_Set_Pwd_DateTime(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 7 + 1, abTime); Setting_Led_Get_Pwd_DateTime(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 1, abTime2); pwd_last_group = (pwd_last_group + 1) % 10; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7), &pwd_valid_flag); for (int i = 1; i <= 9; i++) { pwd_valid_address -= 7; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 7, &pwd_valid_flag_clear); abTime[0] = 0; abTime[1] = 0; abTime[2] = 0; abTime[3] = 0; abTime[4] = 0; abTime[5] = 0; Setting_Led_Set_Pwd_DateTime(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 7 + 1, abTime); Setting_Led_Get_Pwd_DateTime(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7) + 1, abTime2); pwd_last_group = (pwd_last_group + 1) % 10; Setting_Led_Set_Pwd_Valid(ADDR_SETTING_LED_PWD_DATETIME + (pwd_last_group * 7), &pwd_valid_flag); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值