如何使用C++编程使得在Windows和Linux输入密码的时候保密 linux:tcgetattr tcsetattr

在C++编程中,在执行一些操作的时候,终端需要接收用户名和密码,那么在终端输入密码的时候,如何不让别人看见自己的密码,是一个较为关注的问题;

1、问题分析

定义一个登录函数Login

//用户登录主循环bool Login();int MaxLoginTimes=10;
bool XClient::Login()
{bool isLogin = false;for (int i = 0;i < MaxLoginTimes;i++){string username = "";//接收用户输入cout << "\ninput username:" << flush;cin >> username;//接收密码输入string password;cout << "input password:" << flush;//做一个成员将密码不被别人看到cin >> password; //在这里密码是可以被别人看见的}return isLogin;
}

在这种情况下,输入密码的时候,密码是会被看见的,这样很不安全

2、问题解决:

2.1、Windows环境下: 导入包#include<conio.h>

首先,定义一个专门的输入密码的成员

std::string InputPasswod();

直接使用_getch()函数,如果获取输入的字符不显示 ,是因为使用了 getch(),这个内置函数不安全过时了,用_getch()就可以解决问题了

std::string XClient::InputPasswod()
{string password = "";cin.ignore(4096, '\n');for (;;){//获取输入的字符不显示  getch();不安全过时了,用_getch()char a = _getch();if (a <= 0 || a == '\n' || a == '\r')break;cout << "*" << flush;password += a;}return password;
}

在Login函数里面调用

bool XClient::Login()
{bool isLogin = false;for (int i = 0;i < MaxLoginTimes;i++){string username = "";//接收用户输入cout << "\ninput username:" << flush;cin >> username;//cout << "["<< username << "]" << endl;//接收密码输入string password;cout << "input password:" << flush;//做一个成员将密码不被别人看到password = InputPasswod();//下面这行代码,可以查看输入的密码cout << "[" << password <<"]" << endl;}return isLogin;
}

2.2、那么在Linux下就没有#include<conio.h>也就没有这个_getch()函数的定义了,那么我们可以用#include<termio.h>  使用tcgetattr与tcsetattr函数控制终端

定义:

#ifdef _WIN32
#include<conio.h> //但是linux里面没有
#else
#include<termio.h>
char _getch() //在linux自己定义一个这样的函数
{//new_tm新的显示模式,tm_old旧的显示模式termios new_tm;termios old_tm;//将原来的模式存储下来,放在结构体里面int fd = 0;//tcgetattr获取if (tcgetattr(fd, &old_tm) < 0)return -1;//更改为原始模式,没有回显cfmakeraw(&new_tm);//tcsetattr setif (tcsetattr(fd, TCSANOW, &new_tm)<0){return -1;}char c = getchar();//又改回去 改到旧的模式old_tmif (tcsetattr(fd, TCSANOW, &old_tm) < 0){return -1;}return c;
}
#endif // _WIN32

2.3、分析一些linux的tcgetattr函数和tcsetattr函数

tcgetattr用于获取终端的相关参数,而tcsetattr函数用于设置终端参数

定义一个termios结构体

   termios new_tm;termios old_tm;

将文件描述符的属性放入该结构体 

tcgetattr(fd, &old_tm)

将结构体写回文件描述符,激活配置

tcsetattr(fd, TCSANOW, &new_tm)
tcsetattr(fd, TCSANOW, &old_tm)

3、测试

3.1、WIndows测试

3.2、Linux测试

完结花花 

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

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

相关文章

Android蓝牙协议栈fluoride(十一) - 音乐播放(4)

上一篇介绍了蓝牙音频的播放通路和编解码器&#xff0c;接下来介绍Source和Sink如何选择编解码器以及编解码流程。 编解码器选择 连接蓝牙后想要播放音乐&#xff0c;需要协商使用哪种编码器&#xff0c;还需要协商编码器使用什么配置&#xff0c;前面介绍了如何协商编码器的…

Redis分布式锁--java实现

文章目录 Redis分布式锁方案&#xff1a;SETNX EXPIRE基本原理比较好的实现会产生四个问题 几种解决原子性的方案方案&#xff1a;SETNX value值是&#xff08;系统时间过期时间&#xff09;方案&#xff1a;使用Lua脚本(包含SETNX EXPIRE两条指令)方案&#xff1a;SET的扩展…

设计模式之多线程版本的if------Balking模式

系列文章目录 设计模式之避免共享的设计模式Immutability&#xff08;不变性&#xff09;模式 设计模式之并发特定场景下的设计模式 Two-phase Termination&#xff08;两阶段终止&#xff09;模式 设计模式之避免共享的设计模式Copy-on-Write模式 设计模式之避免共享的设计模…

watchdog,一个无敌的 Python 库

大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - watchdog。 在软件开发和系统管理领域&#xff0c;经常需要监控文件和目录的变化&#xff0c;以便在文件被创建、修改或删除时触发相应的操作。Python Watchdog是一个强大的Python库&#xff0c;它提供了简单而灵活的…

低代码开发平台

低代码开发平台&#xff08;LCDP&#xff09;本身也是一种软件&#xff0c;它为开发者提供了一个创建应用软件的开发环境。看到“开发环境”几个字是不是很亲切&#xff1f;对于程序员而言&#xff0c;低代码开发平台的性质与IDEA、VS等代码IDE&#xff08;集成开发环境&#x…

蓝桥杯练习题(九)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;九&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

抖店需要怎么开通?抖店入驻全流程,一看就会!

我是电商珠珠 抖店的热度很高&#xff0c;所以有很多新手想要入驻。 但是对于入驻的流程&#xff0c;部分新手还不太了解&#xff0c;今天我就来给大家详细的讲一下。 入驻准备 在入驻之前需要准备一张个体的营业执照&#xff0c;再准备好个人的身份证、银行卡、抖音号。 …

Tomcat解压打包文件和并部署

一、文件压缩和上传解压 1.本地打包好dist.tar.gz文件 2.通过xftp拖拽上传到知道文件夹下,或者通过命令: cp dist.tar.gz /path/to/destination/folder注:将dist.tar.gz复制到 /path/to/destination/folder文件夹下,该文件夹只是举个例子怎么复制和解压! 3.进入/path/…

使用Python批量上传本地maven库到nexus

背景&#xff1a;外包类项目开发时是调用的公司maven仓库进行开发&#xff0c;交付后需要将maven仓库转移到客户环境。 原理&#xff1a;1、打开idea运行源代码&#xff0c;将maven包下载到本地仓库&#xff0c; 2、下载包所在目录中执行脚本将本地仓库的maven包上传到客户nex…

UE5 C++的TCP客户端示例

客户端.h 需要在Build.cs中加入模块:"Networking","Sockets","Json","JsonUtilities" // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include…

LeetCode第380场周赛个人题解

目录 100162.最大频率元素计数 原题链接 思路分析 AC代码 100165.找出数组中的美丽下标I 原题链接 思路分析 AC代码 100160. 价值和小于等于 K 的最大数字 原题链接 思路分析 位运算二分 AC代码 100207.找出数组中的美丽下标II 原题链接 思路分析 AC代码 10016…

51-13 多模态论文串讲—BEiT v3 论文精读

BEiT-3的核心思想是将图像建模为一种语言&#xff0c;这样我们就可以对图像、文本以及图像-文本对进行统一的mask modeling。Multi-way transformer模型可以有效地完成不同的视觉和视觉语言任务&#xff0c;使其成为通用建模的一个有效选择。 同时&#xff0c;本文也对多模态大…

K8s-Pod资源(一)Pod介绍、创建Pod、Pod简单资源配额

Pod概述 Kubernetes Pod | Kubernetes Pod是Kubernetes中的最小调度单元&#xff0c;k8s都是以pod的方式运行服务的 一个pod可以指定镜像&#xff0c;封装一个或多个容器 pod需要调度到工作节点运行&#xff0c;节点的选择由scheduler调度器实现 pod定义时&#xff0c;会…

Android Studio 如何设置中文

Android Studio 是一个为 Adndroid 平台开发程序的集成开发环境&#xff08;IDE&#xff09;。 如何安装中文插件 在 Jetbrains 家族的插件市场上&#xff0c;是能够搜到语言包插件的&#xff0c;正常情况下安装之后只需要重启即可享受中文界面&#xff0c;可AndroidStudio 中…

Python 列表、元组、字典区别

1.列表、元组和字典都是序列 2.列表字典可以修改和删除序列中的某个元素&#xff0c;而元组就是一个整体&#xff0c;不能修改和删除&#xff0c;一定要修改或删除的话&#xff0c;只能修改和删除整个元组。 3.既然元组不能删除和修改&#xff0c;有什么作用呢&#xff1f; 1…

视频剪辑软件Camtasia2024最新版本快捷键大全

Camtasia Studio是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录 屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等。 今天来给大家介绍一下Camtasia快捷键的相关内容&#xff0c;Camtasia也是一个十分好用的电脑屏幕录制与视频剪辑…

Linux系统——远程访问及控制

目录 一、OpenSSH服务器 1.SSH&#xff08;Secure Shell&#xff09;协议 2.OpenSSH 2.SSH原理 2.1公钥传输原理 2.2加密原理 &#xff08;1&#xff09;对称加密 &#xff08;2&#xff09;非对称加密 2.3远程登录 2.3.1延伸 2.3.2登录用户 3.SSH格式及选项 3.1延…

Pod调度

在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某些节点上&…

跟我学c++高级篇——基础类型和POD结构体反射

一、基础类型反射 在前面以枚举体和函数进行了反射的实践&#xff0c;在其中也提到过&#xff0c;其实更应该进行反射的是类&#xff08;结构体&#xff09;。毕竟现在以面向对象编程基本已经普及&#xff0c;类&#xff08;结构体&#xff09;的应用几乎已经是无法避免的。所…

高斯Hack算法

背景 刷leetcode时&#xff0c;碰到一题需要求解n个bit中选择m个bit的所有组合集&#xff0c;我只想到了递归求解&#xff0c;没啥问题&#xff0c;但是在官方题解中看到了牛逼的方法(Gospers Hack)&#xff0c;故记录一下。 4bit中2个1的情况 0011b0101b0110b1001b1010b1100b…