C++密码管理器

先问一句

最近有几个关注我的原力等级为0或-1,文章全是转载,转载时间基本都在2021年,而且关注了很多人,这些是僵尸粉吗?

文末有投票,麻烦参与一下谢谢


实现功能列表

暂时还没做加密功能 打算用openssl/aes.h 实现 源码在最后面

1. 添加第三方账号密码

  • 输入数据
    • ID:唯一标识账号的编号。
    • 平台:第三方平台的名称(如Facebook、Twitter等)。
    • 账号:用于登录的用户名或电子邮件。
    • 密码:用于登录的密码。
  • 功能
    • 检查ID是否唯一,避免重复添加。
    • 检查密码的安全性(包括强度等级和破解时间估算)。
    • 将账号信息保存到数据文件 data.txt

2. 删除第三方账号密码

  • 输入数据
    • ID:要删除的账号的唯一编号。
  • 功能
    • 根据ID从数据中删除相应的账号信息。
    • 更新 data.txt 文件,删除对应的记录。

3. 查找第三方账号密码

  • 输入数据
    • 平台名称:要查找的第三方平台的名称。
  • 功能
    • 根据平台名称查找所有相关的账号记录。
    • 显示匹配的账号信息(包括ID、平台、账号和密码)。

4. 修改第三方账号密码

  • 输入数据
    • ID:要修改的账号的唯一编号。
  • 功能
    • 根据ID找到并修改对应的账号信息(平台、账号和密码)。
    • 更新 data.txt 文件,保存修改后的记录。

5. 修改管理器密码

  • 输入数据
    • 当前密码:需要验证的旧管理器密码。
    • 新密码:设置的新管理器密码。
  • 功能
    • 验证当前密码是否正确。
    • 更新管理器密码,并保存到文件 password.dat

6. 显示所有弱密码

  • 功能
    • 检查所有账号密码的安全性。
    • 显示所有被标记为“弱”的密码(即不符合安全标准的密码)。

7. 显示重复密码

  • 功能
    • 查找并显示在相同平台上使用的重复密码。
    • 列出所有平台及其对应的重复密码信息。

8. 退出程序

  • 功能
    • 退出密码管理器程序。

部分实现方法

1.密码安全性检测

1.1 检查密码字符类型

密码的强度通常取决于包含的字符类型。我们可以检查以下几种字符类型:

  • 大写字母(A-Z)
  • 小写字母(a-z)
  • 数字(0-9)
  • 特殊字符(如 !@#$%^&*() 等)
1.2 计算密码强度等级

根据字符类型的组合来评估密码的强度:

  • :密码只包含一种类型的字符(例如,只有小写字母)。
  • :密码包含两种类型的字符(例如,小写字母和数字)。
  • :密码包含三种或四种类型的字符(例如,大写字母、小写字母、数字和特殊字符)。
1.3 实现细节
  • 遍历密码中的每一个字符,并检查其类型。
  • 使用布尔变量记录每种字符类型是否存在。
  • 根据这些布尔变量来确定密码的强度等级。

2. 代码实现

以下是一个详细的实现代码示例,演示如何检测密码的安全性:

#include <iostream>
#include <string>
#include <cctype>using namespace std;// 检查密码的强度
string checkPasswordStrength(const string& password) {bool hasUpper = false;   // 是否包含大写字母bool hasLower = false;   // 是否包含小写字母bool hasDigit = false;   // 是否包含数字bool hasSpecial = false; // 是否包含特殊字符// 遍历密码中的每一个字符for (char ch : password) {if (isupper(ch)) {hasUpper = true;    // 发现大写字母} else if (islower(ch)) {hasLower = true;    // 发现小写字母} else if (isdigit(ch)) {hasDigit = true;    // 发现数字} else {hasSpecial = true;  // 发现特殊字符}}// 计算字符类型的总数int score = (hasUpper ? 1 : 0) + (hasLower ? 1 : 0) + (hasDigit ? 1 : 0) + (hasSpecial ? 1 : 0);// 根据字符类型数返回强度等级if (score < 2) return "弱";if (score == 2) return "中";return "强";
}int main() {string password;cout << "请输入密码: ";cin >> password;string strength = checkPasswordStrength(password);cout << "密码强度: " << strength << endl;return 0;
}

3. 代码原理

  1. 布尔变量

    • hasUpper, hasLower, hasDigit, hasSpecial 用于记录密码中是否包含大写字母、小写字母、数字和特殊字符。
  2. 字符检查

    • 使用 isupper(ch), islower(ch), isdigit(ch) 来检查字符是否属于某种类型。
    • 如果字符不属于上述任何一种类型,则认为是特殊字符。
  3. 强度等级

    • 根据布尔变量的状态来计算总的字符类型数。
    • 如果字符类型数少于 2,密码强度为“弱”。
    • 如果字符类型数等于 2,密码强度为“中”。
    • 如果字符类型数大于或等于 3,密码强度为“强”。

2.密码破解时间预估

目标

估算破解密码所需的时间,以评估密码的安全性。通常,这是通过计算密码的可能组合数来完成的。

方法
  1. 计算密码的可能性

    • 字符集:确定密码中可能的字符集。常见字符集包括:
      • 62 个字符:大写字母 (26) + 小写字母 (26) + 数字 (10)
      • 95 个字符:大写字母 + 小写字母 + 数字 + 特殊字符(如 !@#$%^&*()
    • 可能组合数:计算所有可能的密码组合数,这取决于密码长度和字符集大小。
  2. 计算破解时间

    • 假设每秒可以尝试 N 个密码(例如 4,000,000,000 个密码/秒),可以通过以下公式计算估算的破解时间:

预估破解时间的计算

  1. 计算密码的可能组合数

    计算所有可能的密码组合数是预估破解时间的关键。假设密码的长度为 L,并且密码字符集的大小为 C(例如,大写字母、小写字母、数字和特殊字符),那么密码的可能组合数可以通过以下公式计算:

插图的原因是CSDN的markdown编辑器读取不了这几个公式 但我的MARKDOWN编辑器可以读取

[\text{可能组合数} = C^L]

其中,( C ) 是字符集的大小,( L ) 是密码的长度。

  1. 计算破解时间

    假设每秒能够尝试 N 个密码(例如,4,000,000,000 次尝试),可以通过以下公式计算估算的破解时间:

    [\text{破解时间(秒)} = \frac{\text{可能组合数}}{N}]

    其中,( N ) 是每秒尝试的密码数量。

示例

假设密码长度为 8 个字符,字符集包含 62 个字符(大写字母、小写字母和数字),每秒可以尝试 4,000,000,000 个密码。
3. 示例
假设密码长度为 8,字符集大小为 62(包含大写字母、小写字母和数字),每秒尝试次数为 4,000,000,000,则:

在这里插入图片描述

  1. 转换单位
    将破解时间从秒转换为其他更易理解的单位,如分钟、小时、天、年等,可以使用以下公式:
    在这里插入图片描述
代码实现
#include <cmath>double calculateCrackTime(const string& password) {double possibilities = 1;// 假设字符集中包含 62 个字符(大写字母 + 小写字母 + 数字)// 或 95 个字符(包括特殊字符)const double base = 62;  // 可以根据实际字符集调整for (char ch : password) {if (isdigit(ch) || isalpha(ch)) possibilities *= base;else possibilities *= 95;  // 特殊字符包含在 95 个字符集中}// 每秒 4,000,000,000 次尝试const double attemptsPerSecond = 4000000000.0;double timeInSeconds = possibilities / attemptsPerSecond;return timeInSeconds;
}

密码安全性检测主要是为了评估密码的强度,确保其不容易被破解。具体来说,我们可以通过检查密码的字符组成来评估其强度。以下是详细的步骤和代码示例,以及背后的原理。

总结

  • 密码安全性检测:通过检查密码的字符类型和组合来评估密码的强度。
  • 预估破解时间:通过计算密码的可能组合数和每秒破解速度来估算破解密码所需的时间。

效果图

在这里插入图片描述

源代码

注意

如果无法编译请在连接时加入以下参数

-std=c++11

代码

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
#include <cctype>
#include <algorithm>
#include <map>using namespace std;// 数据结构
struct Account {int id;string platform;string username;string password;
};// 密码管理器
class PasswordManager {
private:string masterPassword;vector<Account> accounts;const string dataFileName = "data.txt";const string passwordFileName = "password.dat";const int maxAttempts = 3;// 密码安全性检查string checkPasswordStrength(const string& password) {bool hasUpper = false, hasLower = false, hasDigit = false, hasSpecial = false;for (char ch : password) {if (isupper(ch)) hasUpper = true;else if (islower(ch)) hasLower = true;else if (isdigit(ch)) hasDigit = true;else hasSpecial = true;}int score = (hasUpper ? 1 : 0) + (hasLower ? 1 : 0) + (hasDigit ? 1 : 0) + (hasSpecial ? 1 : 0);if (score < 2) return "弱";if (score == 2) return "中";return "强";}// 计算密码破解时间double calculateCrackTime(const string& password) {// 假设每秒破解4000000000个密码double possibilities = 1;for (char ch : password) {if (isdigit(ch) || isalpha(ch)) possibilities *= 62;  // 数字 + 大小写字母else possibilities *= 95;  // 包含特殊符号}return possibilities / 4000000000.0;}// 保存管理器密码到文件void saveMasterPassword() {ofstream file(passwordFileName);if (file.is_open()) {file << masterPassword << endl;file.close();}}// 从文件加载管理器密码void loadMasterPassword() {ifstream file(passwordFileName);if (file.is_open()) {getline(file, masterPassword);file.close();}}// 检查密码是否匹配bool verifyPassword(const string& password) {return password == masterPassword;}// 保存数据到文件void saveData() {ofstream file(dataFileName);if (file.is_open()) {for (const auto& acc : accounts) {file << acc.id << " " << acc.platform << " " << acc.username << " " << acc.password << endl;}file.close();}}// 显示所有弱密码void displayWeakPasswords() {for (const auto& acc : accounts) {if (checkPasswordStrength(acc.password) == "弱") {cout << "ID: " << acc.id << ", 平台: " << acc.platform<< ", 账号: " << acc.username << ", 密码: " << acc.password << " (弱)" << endl;}}}// 显示重复的密码void displayDuplicatePasswords() {map<string, vector<Account>> platformAccounts;for (const auto& acc : accounts) {platformAccounts[acc.platform].push_back(acc);}for (const auto& pair : platformAccounts) {const auto& accList = pair.second;if (accList.size() > 1) {cout << "平台: " << pair.first << endl;for (const auto& acc : accList) {cout << "ID: " << acc.id << ", 账号: " << acc.username << ", 密码: " << acc.password << endl;}cout << "-----------------------------" << endl;}}}public:PasswordManager() {// 检查是否需要创建管理器密码loadMasterPassword();if (masterPassword.empty()) {cout << "首次启动,请设置管理器密码: ";cin >> masterPassword;saveMasterPassword();}else {// 校验管理器密码int attempts = 0;string password;while (attempts < maxAttempts) {cout << "输入管理器密码: ";cin >> password;if (verifyPassword(password)) {break;} else {cout << "密码错误!" << endl;attempts++;}}if (attempts == maxAttempts) {cout << "尝试次数过多,程序退出。" << endl;exit(1);}}// 从文件加载数据ifstream file(dataFileName);if (file.is_open()) {string line;while (getline(file, line)) {Account acc;istringstream iss(line);iss >> acc.id >> acc.platform >> acc.username >> acc.password;accounts.push_back(acc);}file.close();}}// 添加第三方账号密码数据void addAccount() {Account acc;cout << "输入ID: ";cin >> acc.id;// 检查ID是否重复for (const auto& a : accounts) {if (a.id == acc.id) {cout << "ID " << acc.id << " 已经存在,请使用其他ID。" << endl;return;}}cout << "输入平台: ";cin >> acc.platform;cout << "输入账号: ";cin >> acc.username;cout << "输入密码: ";cin >> acc.password;string strength = checkPasswordStrength(acc.password);double crackTime = calculateCrackTime(acc.password);cout << "密码强度: " << strength << endl;cout << "估计破解时间: " << fixed << setprecision(2) << crackTime << " 秒" << endl;accounts.push_back(acc);saveData();}// 删除第三方账号密码数据void deleteAccount() {int id;cout << "输入要删除的账号ID: ";cin >> id;auto it = remove_if(accounts.begin(), accounts.end(), [id](const Account& acc) {return acc.id == id;});accounts.erase(it, accounts.end());saveData();}// 查找第三方账号密码数据void findAccount() {string platform;cout << "输入平台名称: ";cin >> platform;for (const auto& acc : accounts) {if (acc.platform.find(platform) != string::npos) {cout << "ID: " << acc.id << ", 平台: " << acc.platform<< ", 账号: " << acc.username << ", 密码: " << acc.password << endl;}}}// 修改第三方账号密码数据void modifyAccount() {int id;cout << "输入要修改的账号ID: ";cin >> id;for (auto& acc : accounts) {if (acc.id == id) {cout << "输入新的平台: ";cin >> acc.platform;cout << "输入新的账号: ";cin >> acc.username;cout << "输入新的密码: ";cin >> acc.password;saveData();return;}}cout << "未找到ID为" << id << "的账号。" << endl;}// 修改管理器密码void changeMasterPassword() {string oldPassword, newPassword;cout << "输入当前密码: ";cin >> oldPassword;if (oldPassword != masterPassword) {cout << "密码错误。" << endl;return;}cout << "输入新密码: ";cin >> newPassword;masterPassword = newPassword;saveMasterPassword();}// 显示所有弱密码void showWeakPasswords() {displayWeakPasswords();}// 显示重复的密码void showDuplicatePasswords() {displayDuplicatePasswords();}
};int main() {PasswordManager pm;int choice;while (true) {cout << "1. 添加第三方账号密码\n";cout << "2. 删除第三方账号密码\n";cout << "3. 查找第三方账号密码\n";cout << "4. 修改第三方账号密码\n";cout << "5. 修改管理器密码\n";cout << "6. 显示所有弱密码\n";cout << "7. 显示重复密码\n";cout << "8. 退出\n";cout << "请选择: ";cin >> choice;switch (choice) {case 1: pm.addAccount(); break;case 2: pm.deleteAccount(); break;case 3: pm.findAccount(); break;case 4: pm.modifyAccount(); break;case 5: pm.changeMasterPassword(); break;case 6: pm.showWeakPasswords(); break;case 7: pm.showDuplicatePasswords(); break;case 8: return 0;default: cout << "无效选项。" << endl; break;}}
}

送一首

逻辑严密思无瑕,论证精辟显才华。
条理分明层次清,剖析深入浅出嘉。
例证丰富启思遐,见解独到惠众夸。
文章传世惠千家,启迪智慧泽八涯。

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

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

相关文章

HTTPS通讯全过程

HTTPS通讯全过程 不得不说&#xff0c;https比http通讯更加复杂惹。在第一次接触https代码的时候&#xff0c;不知道为什么要用用证书&#xff0c;公钥是什么&#xff1f;私钥是什么&#xff1f;他们作用是什么&#xff1f;非对称加密和对称加密是啥&#xff1f;天&#xff0c;…

可视化大屏入口界面,炫酷科技又不失简洁时尚。

可视化大屏界面&#xff0c;大家见到很多了&#xff0c;当可视化大屏是多个系统的融合&#xff0c;而且彼此又相互独立&#xff0c;就需要设计一个入口页面&#xff0c;便于分流客户&#xff0c;这次我给大家分享一批。 设计可视化大屏入口界面时&#xff0c;可以结合炫酷科技…

startData

某音startData 记得加入学习群&#xff1a; python爬虫&js逆向3 714283180

leetcode算法题之N皇后

N皇后也是一道很经典的问题&#xff0c;问题如下&#xff1a; 题目地址 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你…

记录Java使用websocket

实现场景&#xff1a;每在小程序中添加一条数据时&#xff0c;后台将主动推送一个标记给PC端&#xff0c;PC端接收到标记将进行自动播放音频。 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import or…

游戏管理系统

目录 Java程序设计课程设计 游戏管理系统 1系统简介 1.1需求分析 1.2 编程环境与工具 2系统总体设计 2.1 系统的功能模块图。 2.2 各功能模块简介。 3主要业务流程 &#xff08;1&#xff09;用户及管理员登录流程图 &#xff08;2&#xff09;信息添加流程 &#x…

即插即用的3D神经元注意算法

在快速发展的人工智能领域&#xff0c;科技的进步往往源于对复杂问题的突破性解决方案。如今&#xff0c;我们正站在一种激动人心的技术创新的前沿——即插即用的3D神经元注意算法。这一前沿技术不仅为计算神经科学提供了全新的视角&#xff0c;也为人工智能的未来打开了新的大…

Python教程(十四):Requests模块详解

目录 专栏列表前言&#xff1a;安装 Requests查看包安装情况&#xff1a; RESTful 介绍RESTful API设计原则示例 基本用法1. 查询ID为1的用户&#xff08;GET&#xff09;2. 创建新用户&#xff08;POST&#xff09;3. 更新ID 为 1 的用户&#xff08;PUT&#xff09;4. 删除ID…

18. 基于ES实战海量数据检索

18. 基于ES实战海量数据检索 一. 概述二. Elasticsearch 全文检索1. 分布式搜索引擎2. 搜索引擎种类3. 倒排索引三. elastic使用1. 官网介绍2. docker安装3. elasticsearch-head工具4. 分词与内置分词4.1 内置分词器(了解即可)4.2 `IK`中文分词器三. 整合SpringCloud1. 基础配置…

计算函数(c语言)

1.描述 //小乐乐学会了自定义函数&#xff0c;BoBo老师给他出了个问题&#xff0c;根据以下公式计算m的值。 // //其中 max3函数为计算三个数的最大值&#xff0c;如&#xff1a; max3(1, 2, 3) 返回结果为3。 //输入描述&#xff1a; //一行&#xff0c;输入三个整数&#xff…

视频汇聚/安防综合管理系统EasyCVR非管理员账户能调用分配给其他用户的通道是什么原因?

视频汇聚/安防综合管理系统EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。平台不仅具备视频资源管理、设备管理、用户管理、网络管理和安…

超精细CG杰作:8K壁纸级官方艺术插画,展现极致美丽与细节的汉服女孩

极致精美的数字艺术杰作&#xff1a;8K壁纸级别的官方插画&#xff0c;展现超高清细节与和谐统一的美感&#xff0c;女孩的精致面容与眼神在光影下熠熠生辉&#xff0c;汉服主题下的超高分辨率作品&#xff0c;文件巨大&#xff0c;细节丰富&#xff0c;令人惊叹。 正向提示词…

Android gradle 构建

Understanding Tasks - Gradle task kapt 是 Kotlin 语言的注解处理器&#xff0c;它是 Android Studio 中用于处理 Kotlin 注解的工具。它通过在编译期间生成代码来增强 Kotlin 代码的功能。需要 Kotlin 编译器来解析和处理注解&#xff1b;使用 APT 来生成代码&#xff0c…

【初阶数据结构】链表(附题)

目录 一、顺序表的问题及思考 二、单链表 2.1链表的概念及结构 2.2.单链表的实现 2.2.1.节点的定义 2.2.2.链表的打印 2.2.3.头部插入删除/尾部插入删除 a.创建节点 b.尾插 c.头插 d.尾删 e.头删 2.2.4.查找数据 2.2.5.在指定位置之前插入数据 2.2.6删除pos节点 …

每日OJ_牛客_DP3跳台阶扩展问题

目录 DP3跳台阶扩展问题 题解代码1&#xff08;dp&#xff09; 题解代码2&#xff08;找规律&#xff09; DP3跳台阶扩展问题 跳台阶扩展问题_牛客题霸_牛客网 题解代码1&#xff08;dp&#xff09; 假定第一次跳的是一阶&#xff0c;那么剩下的是n-1个台阶&#xff0c;跳法…

矩阵中的最大得分(Lc3148)——动态规划

给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&#xff09;。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1 。 你可以从 任一 单元格开始&#xff0c;并且必须…

Spring由哪些模块组成?

Spring由哪些模块组成&#xff1f; 简单描述则是主要由以下几个模块组成&#xff1a; Spring框架采用的是分层架构&#xff0c;它一系列的功能要素被分成20个模块&#xff0c;这些模块大体分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programmi…

Spring:IOC的详解☞Bean的实例化、Bean的生命周期

1、Bean基础配置 bean的基础配置&#xff1a; <bean id"" class""/> Bean的别名&#xff1a;name属性 Bean的作用范围&#xff1a;scope配置 使用bean的scope属性可以控制bean的创建是否为单例&#xff1a; singleton 默认为单例prototype 为非单…

ES6 (一)——ES6 简介及环境搭建

目录 简介 环境搭建 可以在 Node.js 环境中运行 ES6 webpack 入口 (entry) loader 插件 (plugins) 利用 webpack 搭建应用 gulp 如何使用&#xff1f; 简介 ES6&#xff0c; 全称 ECMAScript 6.0 &#xff0c;是 JavaScript 的下一个版本标准&#xff0c;2015.06 发版…