【Day_10】密码强度等级

密码强度等级

题目来源

牛客网:密码强度等级

题目描述

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

一、密码长度:
5 分: 小于等于4 个字符
10 分: 5 到7 字符
25 分: 大于等于8 个字符

二、字母:
0 分: 没有字母
10 分: 密码里的字母全都是小(大)写字母
20 分: 密码里的字母符合”大小写混合“

三、数字:
0 分: 没有数字
10 分: 1 个数字
20 分: 大于1 个数字

四、符号:
0 分: 没有符号
10 分: 1 个符号
25 分: 大于1 个符号

五、奖励(只能选符合最多的那一种奖励):
2 分: 字母和数字
3 分: 字母、数字和符号
5 分: 大小写字母、数字和符号

最后的评分标准:

= 90: 非常安全
= 80: 安全(Secure)
= 70: 非常强
= 60: 强(Strong)
= 50: 一般(Average)
= 25: 弱(Weak)
= 0: 非常弱(Very_Weak)

对应输出为:

VERY_SECURE
SECURE
VERY_STRONG
STRONG
AVERAGE
WEAK
VERY_WEAK

请根据输入的密码字符串,进行安全评定。

注:
字母:a-z, A-Z
数字:0-9
符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)
!"#$%&'()*+,-./ (ASCII码:0x21~0x2F)
:;<=>?@ (ASCII码:0x3A~0x40)
[]^_` (ASCII码:0x5B~0x60)
{|}~ (ASCII码:0x7B~0x7E)

提示:
1 <= 字符串的长度<= 300

输入描述

输入一个string的密码

输出描述

输出密码等级

示例1

输入

38$@NoNoN

输出

VERY_SECURE

说明

样例的密码长度大于等于8个字符,得25分;大小写字母都有所以得20分;有两个数字,所以得20分;包含大于1符号,所以得25分;由于该密码包含大小写字母、数字和符号,所以奖励部分得5分,经统计得该密码的密码强度为25+20+20+25+5=95分

示例2

输入

Jl)M:+

输出

AVERAGE

说明:

示例2的密码强度为10+20+0+25+0=55分。

思路分析

  • 这道题没有什么难度,对字符串进行遍历统计即可
  • 遍历前将num,sym定义为0,遍历中进入num的if判断中再进行一个if判断,如果num为0,说明时第一次出现数字,赋值为10;如果num不为0,说不是第一次出现,赋值为20;sym与num原理相同

代码展示

#include<iostream>
#include<string>
#include <cstdio>
using namespace std;

int main() {
    string str;
    int score;
    while (cin >> str)
    {
        //length
        int sz = str.size();
        if (sz <= 4)
        {
            score += 5;
        }
        else if (sz >= 5 && sz <= 7)
        {
            score += 10;
        }
        else
        {
            score += 25;
        }

        //letter
        int upper = 0;
        int lower = 0;
        int num = 0;
        int sym = 0;
        for (auto e : str)
        {
            //标记大写字母
            if (e >= 65 && e <= 90)//可以直接写'A''B'
            {
                upper = 10;
            }
            //标记小写字母
            else if (e >= 97 && e <= 122)
            {
                lower = 10;
            }
            //数字
            else if (e >= 48 && e <= 57)
            {
                if (num)
                {
                    num = 20;
                }
                else
                {
                    num = 10;
                }
            }

            //符号
            else if ((e >= 0x21 && e <= 0x2f) ||
                (e >= 0x3a && e <= 0x40) ||
                (e >= 0x5b && e <= 0x60) ||
                (e >= 0x7b && e <= 0x7e))
            {
                if (sym)
                {
                    sym = 25;
                }
                else
                {
                    sym = 10;
                }
            }
        }
        score = score + upper + lower + num + sym;
        //奖励分数
        if ((upper || lower) && num)
        {
            score += 2;
            if (sym)
            {
                score += 1;
                if (upper && lower)
                {
                    score += 2;
                }
            }
        }
        if (score >= 90)
        {
            cout << "VERY_SECURE" << endl;
        }
        else if (score >= 80)
        {
            cout << "SECURE" << endl;
        }
        else if (score >= 70)
        {
            cout << "VERY_STRONG" << endl;
        }
        else if (score >= 60)
        {
            cout << "STRONG" << endl;
        }
        else if (score >= 50)
        {
            cout << "AVERAGE" << endl;
        }
        else if (score >= 25)
        {
            cout << "WEAK" << endl;
        }
        else
        {
            cout << "VERY_WEAK" << endl;
        }
    }
}
### 配置MySQL 8.0密码强度策略 为了增强安全性,MySQL 8.0引入了`validate_password`插件来管理密码复杂度。此功能允许管理员通过调整几个关键参数来定义更严格的密码创建标准。 #### 启用Validate_Password插件 确保已安装并启用了`validate_password`组件。默认情况下,在许多发行版中它是激活状态的。如果未启用,则需执行如下命令: ```sql INSTALL PLUGIN validate_password SONAME 'validate_password'; ``` #### 设置密码长度最小值 可利用`validate_password.length`变量设定最低字符数需求。这有助于防止用户选用过于简单的短语作为访问凭证[^1]。 ```sql SET GLOBAL validate_password.length = 8; ``` #### 调整组成元素的要求 除了总长度外,还可以规定密码必须包含哪些类型的字符——大写字母、小写字母、数字以及特殊符号。这些选项分别由四个不同的全局系统变量控制: - `validate_password.number_count`: 数字的数量。 - `validate_password.mixed_case_count`: 大写和小写字母组合数量。 - `validate_password.special_char_count`: 特殊字符数目。 例如,要指定至少有一个大写字母、一个小写字母、一个数字和一个特殊字符组成的密码,应该这样操作: ```sql SET GLOBAL validate_password.policy=STRONG; -- 或者 MEDIUM, LOW 取决于具体的安全等级需求 -- 当policy设为STRONG时,默认会应用上述提到的所有条件;对于MEDIUM则只需满足部分条件即可。 ``` #### 修改现有账户的密码政策 一旦更改了服务器级别的配置项之后,任何新建用户的密码都将受到新的规则约束。然而,对于已经存在的帐户而言,除非特别指明更新其属性,否则不会自动受到影响。因此,若希望立即生效新规则给所有用户,应当逐一处理它们: ```sql ALTER USER 'username'@'host' PASSWORD EXPIRE NEVER|DEFAULT, PASSWORD HISTORY DEFAULT|{number}, PASSWORD REUSE INTERVAL {interval} DAY, PASSWORD REQUIRE CURRENT DEFAULT|YES|NO; FLUSH PRIVILEGES; ``` 以上SQL片段展示了怎样针对特定用户名下的条目重置某些与认证有关的行为模式,包括但不限于使旧有密码失效(`EXPIRE`)、阻止重复使用最近几次使用的密钥(`HISTORY`)、限定再次采用相同口令前等待的时间周期(`REUSE INTERVAL`)等[^2]。 #### 自动化审核机制 最后值得注意的是,自MySQL 8.0起还增加了失败尝试跟踪及临时封禁措施等功能,进一步完善了整体防护体系结构。当检测到异常活动迹象时能够及时响应,从而有效降低潜在风险隐患的发生概率[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值