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 writeif (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:主要用于检测数据传输或存储过程中的错误。

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全小白自学

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

常用的Linux的指令

目录 常用指令 1、文件和目录操作&#xff1a; 2、文件查看和编辑 3、系统信息 4、进程管理 5、用户和权限 6、网络操作 7、压缩和解压 8、软件包管理 常用指令 1、文件和目录操作&#xff1a; ls&#xff1a;列出目录内容 cd&#xff1a; 切换目录 pwd&#xff1a;显…

vue2+el-select实现分页加载更多功能

需求&#xff1a; 由于项目下拉框数据过多&#xff0c;一次性加载完&#xff0c;会有性能问题&#xff0c;于是希望可以增加分页加载更多功能。 实现效果&#xff1a; 如上图&#xff1a;点击“点击加载更多”按钮&#xff0c;实现分页加载下一页&#xff0c;直到最后一页&am…

华为云(HECS)docker环境下安装jenkins

Jenkins是一个开源的自动化工具&#xff0c;可以自动化地完成构建、测试、交付或部署等任务。总之重点就是三个字&#xff1a;自动化&#xff0c;至于如何实现这些功能&#xff0c;Jenkins基于插件化的机制&#xff0c;提供了众多的插件来完成持续集成CI与持续部署CD。 【持续…

网络安全--基于Kali的网络扫描基础技术

文章目录 1. 标准ICMP扫描1.1使用Ping命令1.1.1格式1.1.2实战 1.2使用Nmap工具1.2.1格式1.2.2实战1.2.2.1主机在线1.2.2.2主机不在线 1.3使用Fping命令1.3.1格式1.3.2实战 2. 时间戳查询扫描2.1格式2.2实战 3. 地址掩码查询扫描3.1格式3.2实战 2. TCP扫描2.1TCP工作机制2.2TCP …

flask web开发学习之初识flask(一)

一、概念 flask是一个使用python编写的轻量级web框架&#xff0c;作者为Armin Ronacher&#xff08;中文名&#xff1a;阿尔敏罗纳彻&#xff09;&#xff0c;它广泛被应用于web开发和API。flask提供了简洁而灵活地方式来构建web应用&#xff0c;它不会强加太多约束&#xff0…

iOS 通用链接的配置(Universal Links)

一、打开Associated Domains 1.首先登录 苹果开发者网站 2.Certificates, Identifiers & Profiles 下的Identifiers 找到要配追的Identifiers 点进去 3.打开Associated Domains然后保存 二、更新Profile文件 如果我们使用自动的&#xff0c;可以忽略这一步&#xff0c;…

Linux详解——常用命令(二)

目录 一、常用命令 1.进程相关命令 2.vi命令 3.软件相关命令 RPM命令 YUM命令 4.用户和组相关命令 5.权限相关命令 一、常用命令 1.进程相关命令 # 1.ps 询在当前控制台上运行的进程 ps -aux 说明:查询系统中所有运行的进程&#xff0c;包括后台进程&#xff0c;其…

服务器主机安全如何保障

随着互联网的快速发展&#xff0c;服务器主机安全问题日益凸显。服务器主机是网络世界中的核心&#xff0c;其安全性关乎着整个网络系统的稳定性和可靠性。 当前&#xff0c;服务器主机面临着多种安全威胁。其中&#xff0c;网络攻击是最为常见的一种。网络攻击者利用各种手段…

linux获得帮助_如何查看命令的用法、作用

Linux获得帮助 多层次的帮助&#xff1a; whatis command --help man and info /usr/share/doc/ Red Hat documentation 、Ubuntu documentation 软件项目网站 其它网站 搜索 whatis 使用数据库来显示命令的简短描述。 [rootlocalhost ~]# whatis rm rm (1) …

【Python】torch.exp()和 torch.sigmoid()函数详解和示例

本文对torch.exp&#xff08;&#xff09;和 torch.sigmoid&#xff08;&#xff09;函数进行原理和示例讲解&#xff0c;以帮助大家理解和使用。 目录 torch.exp函数原理运行示例 torch.sigmoid&#xff08;&#xff09;函数原理运行示例torch.sigmoid相关知识 结合运行 torc…

C语言 移位操作符

<< 左移操作符>> 右移操作符 注&#xff1a;移位操作符的操作数只能是整数。 移位操作符移动的是二进制位。 整数的二进制表示有3种&#xff1a; 原码反码补码 正的整数的原码、反码、补码相同。 负的整数的原码、反码、补码是要计算的。 由负整数原码计算出反…