改密码
SUN的贴心提示
记得前面施工中的注释吗,填坑
还没完
防试锁定要和密码错误判断一起写,但是密码正确之后有很长逻辑链要走,而防试锁定在里面知作用只是简单的赋值———————为了防止喧宾夺主,密码正确之后的逻辑单独写,现在只能打个框架
逻辑流程图
先思考,再展开流程图
为啥这么想?
- 要进入修改密码模式吧
- 记录模式要标志位吧
- 修改密码前要清屏吧
- 第一步就是确认旧密码吧
- 输入旧密码按确认键比对密码后要走不同的流程吧(标记为1)
- 然后输入新密码(又进入按键扫描+确认)吧
- 新密码需要独立变量中转吧
- 新密码也要是6位的
- 新密码第二次输入比对吧
开码!
- 按下按钮标记修改密码
if(KeyNum == 13) // 进入修改密码模式
{
mode = 1; // 修改密码模式
LCD_ShowString(1, 1, "Old Password:");
clearPassword();
}
- 标志位标记模式
unsigned char mode = 0; // 0: 正常模式, 1: 修改密码模式, 2: 确认新密码模式
- 比对原密码
SUN的贴心提示
记不记得我在mode == 0已经if过了,现在,我们需要else if 了
else if(mode == 1) // 修改密码模式
{
if(Password1 == secret1 && Password2 == secret2)
{
clearPassword();
LCD_ShowString(1, 1, "Reset Password:");
mode = 2; // 进入确认新密码模式
}
else
{
LCD_ShowString(1, 14, "ERR");
clearPassword();
P2_0 = 0; // 亮红灯
Delay(1000);
P2_0 = 1;
Buzzer_Time(1000); // 蜂鸣器响
}
}
- 输入新密码并暂存
安全漏洞预测
为了防御不存在的攻击者,请务必注意:改密码的时候也要加入防试逻辑。不过比赛又没要求这个,懒得写了,多一行代码,埋10个雷炸自己
else if(mode == 2) // 设置新密码第一步
{
if(count >= 5) // 确保已经输入了新的密码
{
newSecret1 = Password1; //暂存前五位
newSecret2 = Password2; //暂存后面的
clearPassword(); //清屏
LCD_ShowString(1, 1, "Re-ResetPassword");
mode = 3; // 进入确认新密码模式第二步
}
}
- 新密码确认,防止新密码设置错误
else if(mode == 3) // 设置新密码第二步
{
if(count >= 5 && Password1 == newSecret1 && Password2 == newSecret2) // 确保两次输入的密码一致
{
secret1 = newSecret1;
secret2 = newSecret2;
LCD_ShowString(1, 1, "Successfully ");
LCD_ShowString(2, 1, "Change PassWord!");
Delay(2000);
mode = 0; // 返回正常模式
clearPassword();
LCD_ShowString(2, 1, " "); // 清除第二行显示
LCD_ShowString(1, 1, "PassWord: "); // 恢复显示
}
else
{
LCD_ShowString(1, 1, "------ERR------ ");
clearPassword();
P2_0 = 0; // 亮红灯
Delay(1000);
P2_0 = 1;
Buzzer_Time(1000); // 蜂鸣器响
}
}
组合逻辑
至此,组合逻辑
总流程图
总代码
if(KeyNum == 11) // 确认键
{
if(mode == 0) // 正常模式
{
if(Password1 == secret1 && Password2 == secret2)
{
clearPassword();
LCD_ShowString(1, 1, "Successfully ");
LCD_ShowString(2, 1, "Log in! "); // 更新
P2_1 = 0; // 绿灯亮
loginAttempts = 3; // 重置登录尝试次数
}
else
{
loginAttempts--; // 减少尝试次数
if(loginAttempts > 0)
{
LCD_ShowString(1, 1, "ERROR "); // 更新
LCD_ShowString(2, 1, " TryAgain"); // 更新
clearPassword();
P2_1 = 1; // 绿灯灭
P2_0 = 0; // 红灯亮
Delay(1000);
P2_0 = 1; // 红灯灭
Buzzer_Time(1000); // 蜂鸣器响
LCD_ShowNum(1, 14, loginAttempts, 1); // 显示剩余尝试次数
}
else
{
LCD_ShowString(1, 1, "ERROR"); // 更新
LCD_ShowString(2, 1, "Log in Disabled "); // 更新
LCD_ShowString(2, 1, " "); // 清空第二行显示
loginAttempts = 3; // 重置尝试次数
lockFlag = 1; // 锁定状态激活
Delay(1000); // 稍等一会再开始倒计时
}
}
}
else if(mode == 1) // 修改密码模式
{
if(Password1 == secret1 && Password2 == secret2)
{
clearPassword();
LCD_ShowString(1, 1, "Reset Password:");
mode = 2; // 进入确认新密码模式
}
else
{
LCD_ShowString(1, 14, "ERR");
clearPassword();
P2_0 = 0; // 亮红灯
Delay(1000);
P2_0 = 1;
Buzzer_Time(1000); // 蜂鸣器响
}
}
else if(mode == 2) // 设置新密码第一步
{
if(count >= 5) // 确保已经输入了新的5位密码
{
newSecret1 = Password1;
newSecret2 = Password2;
clearPassword();
LCD_ShowString(1, 1, "Re-ResetPassword");
mode = 3; // 进入确认新密码模式第二步
}
}
else if(mode == 3) // 设置新密码第二步
{
if(count >= 5 && Password1 == newSecret1 && Password2 == newSecret2) // 确保两次输入的密码一致
{
secret1 = newSecret1;
secret2 = newSecret2;
LCD_ShowString(1, 1, "Successfully ");
LCD_ShowString(2, 1, "Change PassWord!");
Delay(2000);
mode = 0; // 返回正常模式
clearPassword();
LCD_ShowString(2, 1, " "); // 清除第二行显示
LCD_ShowString(1, 1, "PassWord: "); // 恢复显示
}
else
{
LCD_ShowString(1, 1, "------ERR------ ");
clearPassword();
P2_0 = 0; // 亮红灯
Delay(1000);
P2_0 = 1;
Buzzer_Time(1000); // 蜂鸣器响
}
}
}
if(KeyNum == 13) // 进入修改密码模式
{
mode = 1; // 修改密码模式
LCD_ShowString(1, 1, "Old Password:");
clearPassword();
}