1. 程式人生 > >密碼不回顯

密碼不回顯

在軟體開發中,往往會遇到要求使用者輸入密碼的情況。出於對密碼的保密,輸入的字元是不會顯示到螢幕上的。例如,在登入Linux系統時,輸入使用者名稱後,輸入的密碼是不顯示的。這裡介紹兩種方法來解決這一問題。

6.5.1  使用curses庫

curses庫是由柏克萊大學的Bill Joy及Ken Arnold所開發的。當時開發curses庫的目的是為了解決程式對於不同終端的相容性。curses庫用於處理Linux/UNIX上的游標移動及螢幕顯示問題。考慮到curses庫的複雜性,這裡只是簡單地介紹一下curses庫的使用。需要這方面詳細資訊可以查閱相關資料。

使用curses庫中的函式前,需要進行必要的初始化工作。程式需要使用initscr函式來開啟curses模式,在結束前呼叫endwin函式來關閉curses模式。程式碼如下:

#include <curses.h>

int main(int argc,char* argv[]){

    initscr();

    endwin();

}

在實際使用中,出於方便的目的,往往把一些初始化的動作放置在初始化函式中,以方便呼叫。具體程式碼如下:

void initial()

{

    initscr();

    cbreak();

    nl();

    noecho();

    intrflush(stdscr,FALSE);

    keypad(stdscr,TRUE);

    refresh();

}

程式碼中使用到了一些curses庫的函式,含義如下。

l     cbreak():呼叫cbreak函式後,除了“Del”和“Ctrl”鍵外,接受其他所有字元輸入。

l     nl()/nonl():輸出時,換行是否作為回車字元。nl函式將換行作為回車符,而nonl函式相反。

l     noecho()/echo():關閉/開啟輸入回顯功能。

l     intrflush(WINDOW *win, bool bf):win為標準輸出。當bf為true時輸入Break,可以加快中斷的響應。但是,有可能會造成螢幕輸出資訊的混亂。

l     keypad(WINDOW *win, bool bf):win為標準輸出。呼叫keypad函式後,將可以使用鍵盤上的一些特殊字元,如方向鍵,轉化成curses.h中的特殊鍵。

l     refresh():重繪螢幕顯示內容。在呼叫initscr函式後,第一次呼叫refresh函式會清除螢幕顯示。

程式p6.3.c給出了使用curses庫實現密碼輸入、遮蔽輸出結果的例項。具體程式碼如下:

//p6.3.c 使用curses實現密碼輸入

#include <stdio.h>

#include <stdlib.h>

#include <curses.h>

#include <unistd.h>

void init()

{

   initscr();

   cbreak();

   nl();

   noecho();

   intrflush(stdscr,FALSE);

   keypad(stdscr,TRUE);

   refresh();

}

int getpasswd(char* passwd, int size)

{

   int c;

   int n = 0;

   printw("Please Input password:");

   do{

      c = getch();

      if (c != '\n'){

         echochar('*');//printw("*");

         passwd[n++] = c;

        }

   }while(c != '\n' && n < (size - 1));

   passwd[n] = '\0';

   return n;

}

int main()

{

   char passwd[20];

   int n;

   init();

   n=getpasswd(passwd, sizeof(passwd));

   printw("\nYour passwd is:%s\n", passwd);

   printw("Press any key continue ...\n");

   refresh();

   getchar();

   endwin();

   return 0;

}

使用gcc編譯該程式,獲得名為p6.5的可執行程式。注意程式中使用了curses庫,因此編譯時要指明該庫的名稱。具體編譯和執行情況如下:

[[email protected] charter6]$ gcc -o p6.3 p6.3.c -lcurses

[[email protected] charter6]$ ./p6.3

Please Input password:*******

Your passwd is:afdafds

Press any key continue ...

6.5.2  使用tcgetattr函式和tcsetattr函式

還有種方法,可以不使用curses庫解決密碼輸入的回顯問題。程式p6.4.c通過使用tcgetattr函式和tcsetattr函式同樣達到了目的。具體程式碼如下:

#include <stdio.h>

#include <termios.h>

#include <unistd.h>

#include <errno.h>

#define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL)

//函式set_disp_mode用於控制是否開啟輸入回顯功能

//如果option為0,則關閉回顯,為1則打開回顯

int set_disp_mode(int fd,int option)

{

   int err;

   struct termios term;

   if(tcgetattr(fd,&term)==-1){

     perror("Cannot get the attribution of the terminal");

     return 1;

   }

   if(option)

       term.c_lflag|=ECHOFLAGS;

   else

       term.c_lflag &=~ECHOFLAGS;

   err=tcsetattr(fd,TCSAFLUSH,&term);

   if(err==-1 && err==EINTR){

       perror("Cannot set the attribution of the terminal");

       return 1;

   }

   return 0;

}

//函式getpasswd用於獲得使用者輸入的密碼,並將其儲存在指定的字元陣列中

int getpasswd(char* passwd, int size)

{

   int c;

   int n = 0;

   printf("Please Input password:");

   do{

      c=getchar();

      if (c != '\n'|c!='\r'){

         passwd[n++] = c;

      }

   }while(c != '\n' && c !='\r' && n < (size - 1));

   passwd[n] = '\0';

   return n;

}

int main()

{

   char passwd[20];

   //首先關閉輸出回顯,這樣輸入密碼時就不會顯示輸入的字元資訊

   set_disp_mode(STDIN_FILENO,0);

   //呼叫getpasswd函式獲得使用者輸入的密碼

   getpasswd(passwd, sizeof(passwd));

   printf("\nYour passwd is:%s\n", passwd);

   printf("Press any key continue ...\n");

   set_disp_mode(STDIN_FILENO,1);

   getchar();

   return 0;

}

使用gcc編譯p6.4.c程式碼,獲得名為p6.4的可執行程式。執行該程式,得到如下的輸出結果:

[[email protected] charter6]$ gcc -o p6.4 p6.4.c

[[email protected] charter6]$ ./p6.4

Please Input password:

Your passwd is:afdfasf

Press any key continue ...

[[email protected] charter6]$

相關推薦

關於c++語言密碼的改進

關於 highlight != 語言 pos 進行 越界 ++ log 我發現上次的超市購物管理系統的密碼不回顯可能導致數組下表越界 於是進行了改進 如下 char *pass() { char a[20],ch; int i=0; while((ch=getch(

Linux下編寫c程式使輸入的密碼問題

#include <stdio.h> #include <termios.h> #include <unistd.h> #include <errno.h>

密碼

在軟體開發中,往往會遇到要求使用者輸入密碼的情況。出於對密碼的保密,輸入的字元是不會顯示到螢幕上的。例如,在登入Linux系統時,輸入使用者名稱後,輸入的密碼是不顯示的。這裡介紹兩種方法來解決這一問題。 6.5.1  使用curses庫 curses庫是由柏克萊大學的

南郵匯編實驗——組合語言實現使用者的登入,密碼

用匯編語言實現使用者的登入,不回顯密碼 程式碼: .586 DATA SEGMENT USE16 STRWELCOME DB 'WELCOME,INPUT YOUR ID$' STRINPUTPASS

ModelDriven資料

問題: 回顯資料時資料無法顯示,經過除錯發現model中的資料都為空。 /** * 到達編輯企業資訊頁面(企業維護-編輯) */ public String updateEntPage(){ return "updateEntPage"; }  /** * 在up

Linux 輸入程式碼

int new_getpass(char* dest, int ml) {struct termios oldflag, newflag;//儲存原有終端屬性和新設定的終端屬性int len;tcgetattr(fileno(stdin), &oldflag);//

解決element ui select下拉框資料問題

<el-select v-model="commonForm.status" clearable placeholder="請選擇"> <el-option v-for="

getpass()函式:螢幕輸入

環境:Vmware Workstation;CentOS-6.4-x86_64 說明: 讀寫使用者輸入,螢幕不回顯 char *getpass( const char *prompt); getpa

對於ueditor自定義上傳,圖片的一些筆記

這篇文章,預設你已經成功地實現了ueditor自帶上傳。語言     : JAVA框架     :SSM      ueditor版本 : UEditor 1.4.3.3版本寫這篇文章的目的是因為,再實現圖片自定義路徑上傳的過程中,出現了圖片無法回顯的問題,自己的一些修改記錄

KindEditor中上傳圖片的問題

圖片伺服器配置路徑如圖所示時: 圖片回顯請求地址為: 回顯地址中的"http://localhost:8080"多餘,所以找不到回顯圖片, 將圖片伺服器的地址前加上"http://"後(如圖所示

curses庫是由柏克萊大學的Bill Joy及Ken Arnold所開發的。當時開發curses庫的目的是為了解決程式對於不同終端的相容性。curses庫用於處理Linux/UNIX上的游標移動及螢幕顯示問題。考慮到curses庫的複雜性,這裡只是簡單地介紹一下curs

Ajax 的同步和非同步,下拉框 聯動 第二個成功

Ajax 的同步和非同步,下拉框 聯動 回顯第二個不能回顯成功 示例: 使用Ajax 實現下拉框聯動 回顯 出現呢只有第一個能夠回顯成功 其餘的都不能正常回顯。 原因 :使用了Ajax的非同步 select的賦值再 非同步之前導致的 ( 賦值前個彈出 可以暫停賦值的執行順序 先載入後賦值 )

easyUI FileBox(檔案框)的setValue能用,檔名稱則可以用prompt代替

FileBox(檔案框)元件在表單當中表示一個檔案上傳的欄位。它擴充套件自 textbox(文字框),大部分的 屬性、事件和方法都繼承自文字框。但是由於瀏覽器的安全問題,其中的某些方法(如:"setValue") 則不能用於 filebox 元件。 <input id="Xxx_Doc

關於單選框、下拉框、複選框的資料問題以及全選和全

在列表顯示的介面中通常都有編輯操作,進行編輯操作時通常就牽涉到資料的回顯問題,本文中編輯介面和新增介面是在同一個介面。 頁面中使用了jstl中的c標籤,所以要先引用: <%@ taglib prefix="c" uri="http://java.sun.com/js

Angularjs開發微信單頁面應用時,jssdk選擇圖片wx.chooseImage時是出

使用Angularjs開發微信單頁面應用時,選擇圖片wx.chooseImage時回顯是出不來,感覺是被Angularjs的$sec攔截,嘗試過一下幾種方法,最終解決。 1、過濾器 新增過濾器 .fi

powershell載入mimikatz 抓密碼 (無檔案,躲過殺軟,可以nc)

powershell "IEX (New-Object Net.WebClient).DownloadString('http://is.gd/oeoFuI'); Invoke-Mimikatz -DumpCreds"  powershell "IEX (New-Object

TP5中含圖片的表單ajax上傳(含圖片

前端:<div class="page-container"> <form action="" method="post" class="form form-horizontal" id="formadd"> <div class="row

easy-ui的datetimebox能清除的問題

這種日期時間外掛很多,平時也積累了幾個好用的,但使用easyui後就使用它自帶的datetimebox,發現一個問題,在通用的查詢框中,一般都會回顯上次的查詢時間,但如果通過手動清除後再次查詢,發現近清楚不掉了,十分的坑娘,經過一番折騰後,搞定了它。 1、在你的input元