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

news2024/11/23 21:40:21

一种简单的登录设计,密码保存在本地。(直接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:主要用于检测数据传输或存储过程中的错误。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eNSP防火墙USG6000V使用Web界面登入教程

文章目录 登入流程1、下载USG6000V的镜像包2、导入USG6000V的镜像包3、配置防火墙web页面4、修改本机vmnet1网卡的ipv4地址5、在eNSP上添加云6、配置防火墙管理地址&#xff0c;开启http服务7、关闭电脑防火墙8、访问web页面 登入流程 1、下载USG6000V的镜像包 链接&#xff…

数字人担任展会虚拟主持人,如何释放大会新活力?

近日&#xff0c;虚拟主持人谷小雨解锁新身份&#xff0c;作为第二届全球数字贸易博览会的“数字新闻官”为大众播报展会的热门新闻话题&#xff0c;带领大众探索未来数字贸易的无限可能。 *图片源于网络 随着元宇宙的概念更多地深入各领域&#xff0c;数字人多次以虚拟主持人或…

Docker | 自定义Docker镜像

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Docker系列 ✨特色专栏&#xff1a; My…

Spring---IOC与DI

文章目录 什么是Spring&#xff1f;什么是Ioc&#xff1f;通过代码案例理解总结代码案例真正理解Ioc 什么是DI&#xff1f; 什么是Spring&#xff1f; Spring指的是 Spring Framework &#xff08;Spring框架&#xff09;&#xff0c;它是一个开源的框架&#xff0c;有着活跃而…

【带头学C++】----- 八、C++面向对象编程 ---- 8.7 引用(Reference)

目录 8.7 引用&#xff08;Reference&#xff09; 8.7.1 普通变量引用 8.7.2 数组引用 8.7.3 指针变量的引用方法 8.7.4 函数的引用 8.7.5 引用作为函数的参数 8.7.6 引用作为函数的返回值类型 1. 返回值类型不用使用局部变量的引用类型 2.返回值类型为引用&#xff0…

es集群相关报错信息

给es集群添加用户密码的时候&#xff0c;会自动弹出相关的账户信息&#xff0c;这个时候&#xff0c;只需要设置对应密码就可以了 [esuserjky-test1 bin]$ ./elasticsearch-setup-passwords interactive future versions of Elasticsearch will require Java 11; your Java ve…

【Linux】了解进程的基础知识

进程 1. 进程的概念1.1 进程的理解1.2 Linux下的进程1.3 查看进程属性1.4 getpid和getppid 2. 创建进程3. 进程状态4. 进程优先级5. 进程切换6. 环境变量7. 本地变量与内建命令 1. 进程的概念 一个已经加载到内存中的程序&#xff0c;叫做进程&#xff08;也叫任务&#xff09…

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

文章目录 2021年全国硕士研究生入学招生考试英语二试题SectionⅠUse of EnglishSection Ⅱ Reading ComprehensionText 1Text 2Text 2Text 3Text 4 Section III TranslationSection Ⅳ Writing 2021年全国硕士研究生入学招生考试英语二试题 SectionⅠUse of English Directio…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中,获取不同的数据可能会出现需要请求多个不同服务器地址的域名,这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置: 跨域配置: 在vue项目的vue.config.js文件…

GAN:ImprovedGAN-训练GAN的改进策略

论文&#xff1a;https://arxiv.org/abs/1606.03498 代码&#xff1a;https://github.com/openai/improved_gan 发表&#xff1a;NIPS 2016 一、文章创新 1&#xff1a;Feature matching&#xff1a;特征匹配通过为生成器指定新目标来解决GANs的不稳定性&#xff0c;从而防止…

很清楚展示GPT插件的调用过程,人工智能(AI)的潜在危险与好处 超级智能 未来

好处&#xff0c;未来 很清楚展示GPT插件的调用过程&#xff1a; 把请求和要求发chatGPT chatGPT返回markdown格式发给插件 插件返回结果给用户。 你不用别人用。 人工智能&#xff08;AI&#xff09;的最危险之处通常与以下几个方面有关&#xff1a; 自主决策能力过强&…

一篇博客带你了解TCP网络传输协议

Transmission Control Protocol&#xff08;TCP&#xff0c;传输控制协议&#xff09;是互联网协议套件中的一种主要协议之一&#xff0c;负责在网络上可靠地传输数据。下面是TCP协议的详细讲解&#xff1a; 1. 基本概念&#xff1a; 面向连接&#xff1a; TCP是一种面向连接的…

2.安装docker

目录 1 安装依赖 2 安装docker 3 测试 目前docker分为三类 Docker-CE(社区版),Docker-EE(企业版)和Moby。Moby是docker社区用户自己写的&#xff0c;所以Moby我们一般用不上 每一类的每一个版本中都有Edge与Stable版&#xff0c;Stable维护4个月&#xff0c;Edge维护1个…

在柯桥西班牙语论文写作,连接词只会用porquepero?西语连接词大全来啦~

Adicin -agregan nuevos datos al desarrollo de una idea o introduce otro aspecto del tema. 为观点的论述增添新的信息&#xff0c;或介绍主题的另一个方面。 1 Lista de conectores 连接词列表 Adems. As mismo. Hay que mencionar, adems. Habra que decir tambin. Mas …

当消费增值模式遇上Dapp:擦出创新商业的火花

随着区块链技术和智能合约的不断发展&#xff0c;去中心化应用&#xff08;Dapp&#xff09;逐渐成为一种创新的商业模式。当消费增值模式与Dapp相遇&#xff0c;它们之间擦出了怎样的火花呢&#xff1f; 一、Dapp与消费增值模式的结合 Dapp是一种基于区块链技术和智能合约的去…

分层理解Java字符串常量池

Java是一门计算机编程语言&#xff0c;但我们脑海中所理解的Java不仅仅是一门语言。它还包括Java虚拟机&#xff08;JVM&#xff09;的一系列规定&#xff0c;及具体Java产品&#xff08;如Hotspot&#xff09;的实现原理。 不管我们日常在Java中用到的任何一种语法&#xff0…

python如何抓取携程酒店的价格,让工作更简单点

有时候老板没事安排点事&#xff0c;为了偷懒&#xff0c;只能使出大招&#xff0c;毕竟自己不是那么老老实实干活的人&#xff0c;整理数据这类累和繁琐的活&#xff0c;我怎么能轻易动&#xff0c;好在gpt可以帮我来实现&#xff0c;有人可能会说&#xff0c;这么点内容你还不…

在线陪诊系统: 医疗科技的崭新前沿

在医学科技的快速发展中&#xff0c;在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术&#xff0c;这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…

面试题:说一下MyBatis动态代理原理?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.MyBatis简介2.使用步骤2.1、引入依赖2.2、配置文件2.3、接口定义2.4、加载执行 3.原理解析 1.MyBatis简介 MyBatis是一个ORM工具&#xff0c;封装了JDBC的操作&a…

k8s中pod的hostport端口突然无法访问故障处理

故障背景&#xff1a; 租户告知生产环境的sftp突然无法访问了&#xff0c;登录环境查看sftp服务运行都是正常的&#xff0c;访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查&#xff0c;看看哪里出了问题&#xff0c;看下sftp日志&#…