控制台下星号密码输入的实现

最近频繁需要实现在windows控制台下输入星号密码的功能,Unix/Linux那种没有任何屏显的实现总感觉对用户不太友好。今天在自己的Linux代码库中发现了自己去年写图书馆管理系统的时候写的一个密码输入函数。索性拿来修改了接口并且重新优化了处理逻辑后移植到了windows下(其实也就是加上几句条件编译罢了)。代码如下:

#ifndef _WIN32 // 如果不是WIN32环境,则要自定义getch()函数
#include <termio.h>

int getch(void)
{
     struct termios tm, tm_old;
     int fd = 0, ch;

     if (tcgetattr(fd, &tm) < 0) {
          return -1;
     }

     tm_old = tm;
     cfmakeraw(&tm);
     if (tcsetattr(fd, TCSANOW, &tm) < 0) {
          return -1;
     }

     ch = fgetc(stdin);
     if (tcsetattr(fd, TCSANOW, &tm_old) < 0) {
          return -1;
     }

     return ch;
}
#else
#include <conio.h>
#endif // _WIN32

/*
* 密码输入函数,参数 passwd 为密码缓冲区,buff_len 为缓冲区长度
*/
char *passwd_input(char *passwd, int buff_len)
{
     char str;
     int i = 0;
     int enter_num = 13;
     int backspace_num;

     #ifndef _WIN32
     backspace_num = 127;
     #else
     backspace_num = 8;
     #endif

     if (passwd == NULL || buff_len <= 0) {
          return passwd;
     }
     while (1)
     {
          // 如果没有按下退格键
          if ((str = getch()) != (char)backspace_num) {
               if (i < buff_len - 1) {
                    passwd[i++] = str;
                    printf("*");
               }
          } else {
               if (i != 0) {
                    i--;
                    printf("\b \b");
               }
          }
          // 如果按下了回车键
          if (str == (char)enter_num) {
               passwd[--i] = '\0';

               if (i != buff_len - 1) {
                   printf("\b \b");
               }
               break;
          } else if (str == -1) {
               fprintf(stderr, "Error to set termio noecho.n");
          }
     }

     return passwd;
}

/*
// 测试示例(请自行添加头文件)
int main(void)
{
      char pass[7];

      printf("亲,试试输入密码(长度限制 6):");
      passwd_input(pass, 7);
      printf("\n%s\n", pass);

     return 0;
}
*/
 
时间: 2024-08-30 20:52:40

控制台下星号密码输入的实现的相关文章

汇编源代码之简单密码输入

title***简单密码输入 by lluct***datasegment ;定义数据段input db 100 dup (?);定义输入的字符串,字符串必须用db定义,长度为100个字节cmpare db '5201314','$';定义密码msg1 db 'PASSWORD RIGHT!','$';定义输入密码正确后显示出来的信息msg2 db 'PASSWORD ERROR!','$';定义输入密码错误后显示出来的信息headmsg db 'ENTER YOUR PASSWORD:','$

漏洞-关于星号密码查看工具的几个问题

问题描述 关于星号密码查看工具的几个问题 接触到一款叫bullet的查看星号密码的工具,可以记录下在密码输入框里输入过的密码信息并转换为明文查看, 找了几个需要登陆的网页和软件做了一些实验,有些成功了,捕捉到而且记录了星号密码是什么,有些想qq这种可以捕捉到有输入密码的行为,但是看不出密码是什么,有些根本捕捉不到. 所以非常想问一问为什么会有不同,不同之处在哪里.这种密码框输入后的传输的机制是什么.这种星号密码查看器又是根据什么漏洞来实现这种功能的呢? 解决方案 密码框是一个Windows的一个

js控制文本框只输入数字和小数点的方法

 这篇文章主要介绍了js控制文本框只输入数字和小数点的方法,实例分析了javascript使用正则表达式实现限制数字和小数点的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了js控制文本框只输入数字和小数点的方法.分享给大家供大家参考.具体实现方法如下: 代码如下: function clearNoNum(obj) { obj.value = obj.value.replace(/[^d.]/g, "");//清除"数字"和".&q

arm7s3c44b0x-ARM7图案解锁或者滑动解锁并且支持密码输入解锁

问题描述 ARM7图案解锁或者滑动解锁并且支持密码输入解锁 我的期末作业需要基于ARM7S3C44B0X实现类似于安卓手机的图案解锁或者滑动解锁并且支持密码输入解锁希望专业技术人才能帮忙给我一个实例,或者提示我怎么去完成这个小项目不知道是不是对于一个初学的大学生有难度

一个看似简单实则颇有些难度的go语言问题,关于密码输入

问题描述 一个看似简单实则颇有些难度的go语言问题,关于密码输入 RT. 具体要求:输入一串字符(中间可能有各种空格啊符号啊之类)作为密码,以回车键结束 由于是密码,所以输入时屏幕不能明文显示,当每输入一个字符则显示为一个*,最后密码由一个string型变量获取 好像用go语言不是那么好实现,尤其是考虑到退格键以及方向键改变输入顺序的问题(比如输入的时候用方向键将光标前移后插入内容),还有delete键带来的删除效果-- 各位大神有什么好的解决方案?期待最简洁的代码--

有关能记录账号、密码输入的键盘记录器

有关能记录账号.密码输入的"键盘记录器",过去几天在网上引发关注.对此,有网友在果壳网发布测试报告,称"'键盘记录器'确实存在,而且比我们想象的强大得多". 外观不起眼 酷似U盘 "如果你去网吧或公共场所上网,看到如图所示(的物件)连接到你的键盘线上面,请不要使用这台电脑."10月15日,@央视财经在官微中称,图中连接键盘线和主机USB插口的不起眼设备,可以记录上网人所有的键盘操作,"如QQ.支付宝密码,同样也可以记录你的银行帐号密码&

js控制文本框只输入数字和小数点的方法_javascript技巧

本文实例讲述了js控制文本框只输入数字和小数点的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: function clearNoNum(obj) {  obj.value = obj.value.replace(/[^\d.]/g, "");//清除"数字"和"."以外的字符  obj.value = obj.value.replace(/^\./g, "");//验证第一个字符是数字而不是.  obj.

Windows控制台下绘制简单图形

最近接触到一个很有意思的问题,如何在Windows控制台下画图,翻遍了C的头文件也没找到画图的函数,好吧,那就用Windows提供的API函数吧,看来想移植是没戏了.先画一个简单的图,类似心电图那种吧,假设得到的数据是纵坐标的值,横坐标默认从0开始,每隔512uS(微秒的那个符号不会打)得到一个纵坐标值,要求将所有纵坐标值连起来,就以这个简单的程序为例吧. 既然有了需求,实现起来就简单了,首先我们应该有一个控制台窗口的上下文(device context)句柄,然后使用MoveToEx和Line

login-jsp 弹出登录窗口怎么让它密码输入错误时不做操作

问题描述 jsp 弹出登录窗口怎么让它密码输入错误时不做操作 <script> jQuery(document).ready(function($) { $('.theme-login').click(function(){ $('.theme-popover-mask').fadeIn(100); $('.theme-popover').slideDown(200); }) $('.theme-poptit .close').click(function(){ $('.theme-popov