MFC哈希实现 目标:知道初始密码的人,才能改密码及登录。只知道登录密码只能登录。避免密码直接写在代码里或本地,通过软件评估报告。----安全行业基础5

一种简单的登录设计,密码保存在本地。(直接MD5不安全,别人可以更换本地的密码,得再加一层算法就相对安全一点)

当然也可以用加密机或专门存密码的系统来实现,就过于复杂。

目标:1、为了避免密码直接写在代码里或本地,通过软件评估报告。2、知道初始密码的人,才能改密码及登录。只知道登录密码只能登录。

密码

1.初始密码暂时先用这个ASDEedsa@123321,转为MD5写在应用里:5329B69272930C2F9E9F743B11215AFD。修改的密码用MD5计算后保存到注册表 https://www.sojson.com/md5/ 
2.首次登录或点重置密码先输入初始密码,再修改密码,再进入主界面。再次登录就可以使用新密码。
3. 密码规则:数字,字母,大小写,及符号组成的不少于6位的密码。
4. 如果工具在idle 状态下15分钟以上没动,再用工具时,需要用户重新Login。

界面

在这里插入图片描述
条件1实现:https://blog.csdn.net/chenhao0568/article/details/134654801?spm=1001.2014.3001.5501
条件2实现:逻辑了。
条件3实现:https://blog.csdn.net/chenhao0568/article/details/134654768?spm=1001.2014.3001.5501
条件4实现:https://blog.csdn.net/chenhao0568/article/details/134654747?spm=1001.2014.3001.5501

// CPasswordDlg.cpp: 实现文件
//

#include "stdafx.h"
#include "afxdialogex.h"
#include "CPasswordDlg.h"
#include "Resource.h"

static int status = 0;//0输入初始密码 1输入新密码  2正常登录(注册表有密码)
static CString registerPassword = "";
#include "md5.h"
#define MD5_INIT_PASSWORD "5329B69272930C2F9E9F743B11215AFD"
#define KEY_PATH  _T("Software\\MyApplication5329B69272930C2F9E9F743B11215AFD")
#define VALUE_NAME _T("PW_MD5")

void WriteRegistryValue(const CString& keyPath, const CString& valueName, const CString& value) {
	CRegKey key;
	if (key.Create(HKEY_CURRENT_USER, keyPath) == ERROR_SUCCESS) {
		key.SetStringValue(valueName, value);
		key.Close();
	}
}
CString ReadRegistryValue(const CString& keyPath, const CString& valueName) {
	CString value;
	CRegKey key;
	if (key.Open(HKEY_CURRENT_USER, keyPath, KEY_READ) == ERROR_SUCCESS) {
		TCHAR buffer[256];
		ULONG len = 256;
		if (key.QueryStringValue(valueName, buffer, &len) == ERROR_SUCCESS) {
			value = buffer;
		}
		key.Close();
	}
	return value;
}

bool IsPasswordValid(const CString& password) {
	if (password.GetLength() < 6) {
		return false;  // 密码长度不足6位
	}

	bool hasDigit = false;
	bool hasLower = false;
	bool hasUpper = false;
	bool hasSymbol = false;

	for (int i = 0; i < password.GetLength(); ++i) {
		TCHAR ch = password[i];

		if (_istdigit(ch)) {
			hasDigit = true;
		}
		else if (_istlower(ch)) {
			hasLower = true;
		}
		else if (_istupper(ch)) {
			hasUpper = true;
		}
		else if (_istpunct(ch)) {
			hasSymbol = true;
		}
	}

	return hasDigit && hasLower && hasUpper && hasSymbol;
}

// CPasswordDlg 对话框
IMPLEMENT_DYNAMIC(CPasswordDlg, CDialogEx)

CPasswordDlg::CPasswordDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_DIALOG1, pParent)
{
}

CPasswordDlg::~CPasswordDlg()
{
}

void CPasswordDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CPasswordDlg, CDialogEx)
	ON_BN_CLICKED(IDOK, &CPasswordDlg::OnBnClickedOk)
	ON_BN_CLICKED(IDR_GERTEC_ADBKEY11, &CPasswordDlg::OnBnClickedGertecAdbkey11)
END_MESSAGE_MAP()


// CPasswordDlg 消息处理程序
void CPasswordDlg::OnBnClickedOk()
{
	CString password="";
	GetDlgItem(IDC_EDIT1)->GetWindowText(password);

	unsigned char out[MD5_MAX_LEN] = { 0 };
	md5((const unsigned char*)password.GetBuffer(), strlen(password), out);
	char hex_md5[MD5_MAX_LEN] = { 0 };
	byteToHexStr(out, 16, (char*)hex_md5);

	if (status == 0)
	{
		if (memcmp(MD5_INIT_PASSWORD, hex_md5, strlen(MD5_INIT_PASSWORD)) == 0)
		{
			status = 1;
			this->SetWindowText("Please enter a new password");
		}
		else
		{
			AfxMessageBox("Password error");
		}
		GetDlgItem(IDC_EDIT1)->SetWindowText("");
		GetDlgItem(IDC_EDIT1)->SetFocus();
		return;
	}
	else if (status == 1)
	{
		//check and write
		if (IsPasswordValid(password))
		{
			memcpy(registerPassword.GetBuffer(strlen(MD5_INIT_PASSWORD)), hex_md5, strlen(MD5_INIT_PASSWORD)); registerPassword.ReleaseBuffer();
			WriteRegistryValue(KEY_PATH, VALUE_NAME, registerPassword);
			AfxMessageBox("Password set successfully");
			CDialogEx::OnOK();
		}
		else
		{
			AfxMessageBox("Password error,the password must be at least 6 characters long and include numbers, letters, both upper and lower case, and symbols.");
			GetDlgItem(IDC_EDIT1)->SetWindowText("");
			GetDlgItem(IDC_EDIT1)->SetFocus();
		}

	}
	else
	{
		if (memcmp(registerPassword, hex_md5, strlen(MD5_INIT_PASSWORD)) == 0)
		{
			CDialogEx::OnOK();
		}
		else
		{
			AfxMessageBox("Password error");
			GetDlgItem(IDC_EDIT1)->SetWindowText("");
			GetDlgItem(IDC_EDIT1)->SetFocus();
		}
	}

}


BOOL CPasswordDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	//WriteRegistryValue(KEY_PATH, VALUE_NAME, MD5_INIT_PASSWORD);
	//WriteRegistryValue(KEY_PATH, VALUE_NAME, "");
	registerPassword = ReadRegistryValue(KEY_PATH, VALUE_NAME); registerPassword.ReleaseBuffer();
	if (registerPassword.GetLength() > 0)
	{
		status = 2;
		this->SetWindowText("Please input password");
	}
	else
	{
		status = 0;
		this->SetWindowTextA("Please enter the initial password");
	}
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}


void CPasswordDlg::OnBnClickedGertecAdbkey11()
{
	status = 0;
	this->SetWindowTextA("Please enter the initial password");
	GetDlgItem(IDC_EDIT1)->SetWindowText("");
	GetDlgItem(IDC_EDIT1)->SetFocus();
}

再加一层算法,比如写前按一组随机的数字相加,读后再反操作。

哈希算法(Hash Algorithm)是一种从任意长度的消息中创建小的固定长度“哈希值”(或“哈希代码”)的算法。哈希算法在计算机科学中有着广泛的应用,例如数据检索、安全加密和数据完整性验证。以下是一些主要的特点和应用场景:

特点

  1. 确定性:相同的输入总是产生相同的哈希值。
  2. 高效计算:能够快速计算出任意输入数据的哈希值。
  3. 抗碰撞性:找到两个不同的输入但产生相同哈希值的情况非常困难。
  4. 原像抗性:从哈希值很难反推出原始输入数据。

应用场景

  1. 数据存储:数据库和其他数据结构(如哈希表)使用哈希算法快速定位和检索数据。
  2. 安全加密:在密码学中,哈希函数用于加密数据,确保信息传输的安全。
  3. 数据完整性验证:用于检查文件或数据传输过程中是否被篡改。
  4. 数字签名:用于验证文件或消息的真实性。

常见哈希算法

  • MD5:一种广泛使用的哈希算法,但现在被认为是不安全的。
  • SHA系列(如SHA-256):提供更高安全性的哈希算法,广泛用于加密货币和网络安全。
  • CRC32:主要用于检测数据传输或存储过程中的错误。

哈希算法的选择取决于具体的应用需求,如对速度、安全性或抗碰撞性的不同要求。在安全相关的应用中,选择一个经过时间检验且被广泛认可的安全哈希算法尤为重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/195131.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用shell快速查看电脑曾经连接过的WiFi密码

此方法只能查看以前连接过的wifi名称和对应的密码 查看连接过的WiFi名称netsh wlan show profiles查看具体的WiFi名称netsh wlan show profile name"你的wifi名称" keyclear

plt绘制表格

目录 1、绘制简单表格 2、将字体居中 3、为每个表格添加背景 4、添加透明度 5、不显示表格标题 6、将pandas的表格列转行显示 7、关闭表格边框 8、设置表格长宽、字体大小 9、利用色系指定表格颜色 10、修改字体颜色、边框粗细 1、绘制简单表格 import pandas as pd…

「阿里巴巴」裁撤量子实验室!

据内部消息&#xff0c;阿里巴巴达摩院由于预算及盈利等原因&#xff0c;已经撤裁旗下量子实验室。此次&#xff0c;共计裁减30余人。 达摩院官网已撤下量子实验室的相关介绍页面。上图&#xff1a;早先关于量子实验室的相关介绍&#xff1b;下图&#xff1a;现在达摩院官网“实…

十分钟搭建VScode C/C++运行环境

一、下载配置vscode 1.下载安装VScode 地址&#xff1a;https://code.visualstudio.com/download 下载后&#xff0c;运行安装程序 (VSCodeUserSetup-{version}.exe)。这只需要一分钟。安装程序会将 Visual Studio Code 添加到环境变量中%&#xff0c;可以使用CMD键入“code”…

主播直播表现力

主播表现力:全面提升你的直播效果 一、语言表达 主播的语言表达是直播的关键。优秀的语言表达能够让观众感到亲切和舒适&#xff0c;增加观众的参与度和忠诚度。以下是一些提升语言表达的建议: 1.清晰简洁:尽量使用简单易懂的词汇和句子结构&#xff0c;避免过于复杂的表达。…

C#实体类与XML互转以及List和DataTable转XML的使用

引言 在C#开发中&#xff0c;数据的存储和传输是非常常见的需求。使用XML作为数据格式有很多优点&#xff0c;例如可读性强、易于解析等。而实体类、List和DataTable是表示数据模型的常用方式。本文将介绍如何在C#中实现实体类、List和DataTable与XML之间的相互转换&#xff0c…

好用的样式动画库集合(css、js)

文章目录 前言一、Animate.css二、Anime.js三、CSShake四、Hover.css五、AniJS六、Animista七、Tachyons-animate八、Sequence.js九、Infinite十、OBNOXIOUS.CSS十一、MOTION UI十二、Keyframes.app十三、AnimXYZ十四、Whirl十五、Hamburgers十六、Vivify十七、Magic Animation…

【2021研电赛】智能胸外按压电除颤一体仪

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 团队介绍 参赛单位&#xff1a;上海理工大学 参赛队伍&#xff1a;上理电感队 指导老师&#xff1a;闫士举 参赛队员&#xff1a;夏鹏、李宪龙、张涛 获奖情况&#xff1a;…

有一种浪漫,叫接触Linux

大家好&#xff0c;我是五月。 嵌入式开发 嵌入式开发产品必须依赖硬件和软件。 硬件一般使用51单片机&#xff0c;STM32、ARM&#xff0c;做成的产品以平板&#xff0c;手机&#xff0c;智能机器人&#xff0c;智能小车居多。 软件用的当然是以linux系统为蓝本&#xff0c…

7.5 Windows驱动开发:监控Register注册表回调

在笔者前一篇文章《内核枚举Registry注册表回调》中实现了对注册表的枚举&#xff0c;本章将实现对注册表的监控&#xff0c;不同于32位系统在64位系统中&#xff0c;微软为我们提供了两个针对注册表的专用内核监控函数&#xff0c;通过这两个函数可以在不劫持内核API的前提下实…

Linux 命令ln

1什么是链接 ln在Linux中 ln 命令的功能是为某一个文件在另外一个位置建立一个同步的链接&#xff0c;当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件&#xff0c;我们只要在某个固定的目录&#xff0…

解析和存储优化的批量爬虫采集策略

如果你正在进行批量爬虫采集工作&#xff0c;并且想要优化解析和存储过程&#xff0c;提高采集效率和稳定性&#xff0c;那么本文将为你介绍一些实用的策略和技巧。解析和存储是批量爬虫采集中不可忽视的重要环节&#xff0c;其效率和质量对整个采集系统的性能至关重要。在下面…

笔记十九*、选中高亮和嵌套路由使用

19.1 选中高亮 NavLink App.jsx import React from "react"; import {NavLink, useRoutes} from "react-router-dom"; import routes from "./routes/index.jsx"; import "./app.css"const App () > {const element useRoutes(…

「Verilog学习笔记」整数倍数据位宽转换8to16

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 根据时序图&#xff0c;数据是在第二个数据到来之后输出&#xff0c;当仅有一个数据到来时&#xff0c;不产生输出&#xff0c;所以内部需要一个指示信号valid_cnt&#xf…

31.0/LinkedList/Set/ashSet/ TreeSet/Map/ HashMap/ TreeMap

目录 31.1Linkedlist 31.2Set集合 31.3HashSet集合 31.4添加元素 31.5删除 31.6hashSet的遍历 31.7hashSet的源码 31.8TreeSet集合。 31.1Linkedlist 1.凡是查询源码 &#xff0c;我们都是从类的构造方法入手:/*** Constructs an empty list.*/public LinkedList() {}该…

打破限制!MySQL 5.7至8.0跨版本迁移,1分钟搞定多版本数据迁移

在上个月&#xff0c;MySQL 5.7 正式结束了生命周期&#xff0c;即EOL&#xff08;End of Life&#xff09;&#xff0c;意味着Oracle将不再为 MySQL 5.7 提供技术支持&#xff0c;包括Bug修复或安全漏洞&#xff0c;大大增加了使用数据库的风险。在全球关系型数据库市场中&…

企企通相继出席首届百家新锐企业融通创新交流会与采购数字化创新沙龙,持续深化数字赋能

近期&#xff0c;企企通受邀分别参加了广州、上海业界重磅活动&#xff0c;针对新形势下企业数字化采购升级的新技术与新思路、产业链上下游协同发展等进行探讨&#xff0c;赋能数字化信息技术产业生态发展&#xff0c;并对各方主体如何协作共赢助推企业数字化发展建言献策。 0…

五周年活动周历!AutoGen解析·技术畅聊·3大城市工坊本周启动!

飞桨星河社区在成立的5年以来&#xff0c;已汇集660万AI开发者&#xff0c;覆盖深度学习初学者、在职开发者、企业开发者、高校教师、创业者等&#xff0c;已成为AI领域最具影响力的社区之一&#xff0c;无论是AI爱好者还是AI开发者&#xff0c;都能在这里探索AI的无限可能。 …

工博会新闻稿汇总

23届工博会媒体报道汇总 点击文章标题即可进入详情页 9月23日&#xff0c;第23届工博会圆满落幕&#xff01;本届工博会规模之大、能级之高、新展品之多创下历史之最。高校展区在规模、能级和展品上均也创下新高。工博会系列报道深入探讨了高校科技发展的重要性和多方面影响。…

2022年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2022年全国硕士研究生招生考试英语&#xff08;二&#xff09;试题Section I Use of EnglishSection II Reading ComprehensionText 12122232425 Text 22627282930 Text 33132333435 Text 43637383940 Section III TranslationSection III WritingPart APart B 2022年…