Cara Mengambil Kata Sandi Tersembunyi Dari Terminal Di C/C++
Pernahkah Anda bertanya-tanya, Di beberapa program terminal ketika mereka meminta kata sandi dan Anda memasukkannya, jadi itu tidak menampilkan apa pun atau menampilkan '************' saat mengetik.
Jadi bagaimana program ini mengambil kata sandi?
Mode input default terminal adalah gema, Jadi segera setelah kita mulai mengetik karakter apa pun di terminal, karakter itu muncul di sana secara bersamaan. Tetapi kita dapat mengubah perilaku default ini untuk melakukan tugas kita mengambil kata sandi dari terminal tanpa terlihat.
Berikut adalah program sederhana yang menunjukkan bagaimana kita bisa melakukan ini. termios.h adalah file header tempat semua struct dan fungsi yang terkait dengan terminal didefinisikan.
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
int getch() {
int ch;
// struct to hold the terminal settings
struct termios old_settings, new_settings;
// take default setting in old_settings
tcgetattr(STDIN_FILENO, &old_settings);
// make of copy of it (Read my previous blog to know
// more about how to copy struct)
new_settings = old_settings;
// change the settings for by disabling ECHO mode
// read man page of termios.h for more settings info
new_settings.c_lflag &= ~(ICANON | ECHO);
// apply these new settings
tcsetattr(STDIN_FILENO, TCSANOW, &new_settings);
// now take the input in this mode
ch = getchar();
// reset back to default settings
tcsetattr(STDIN_FILENO, TCSANOW, &old_settings);
return ch;
}
int main(void) {
char password[100];
int i = 0;
int ch;
printf("Enter password: ");
while ((ch = getch()) != '\n') {
if (ch == 127 || ch == 8) { // handle backspace
if (i != 0) {
i--;
printf("\b \b");
}
} else {
password[i++] = ch;
// echo the '*' to get feel of taking password
printf("*");
}
}
password[i] = '\0';
printf("\nYou entered password: %s\n", password);
return 0;
}
Enter password: *****
You entered password: naman
Alih-alih menulis seluruh program ini, kita dapat menggunakan peranan getoass
define inbuild di header unistd.h
untuk mengambil password tanpa gema, tapi kita tidak mendapatkan banyak kendali di sini seperti gema '*' saat menulis.
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *password;
password = getpass("Enter password: ");
printf("You entered password: %s\n", password);
return 0;
}
Enter password:
You entered password: naman
CATATAN: Halaman manual getpass mengatakan fungsi membuka /dev/tty (terminal pengontrol proses), menampilkan prompt string, mematikan gema, membaca satu baris ("kata sandi"), mengembalikan status terminal dan menutup /dev / tty lagi. yang berarti kata sandi tidak akan disimpan dalam riwayat shell.
CATATAN: Implementasi khusus dari program ini juga tidak menyimpan kata sandi di riwayat shell meskipun mengambil input dari stdin. Alasannya adalah fungsi getch membaca karakter langsung dari terminal tanpa menunggu pengguna menekan tombol enter, sehingga kata sandi tidak diteruskan ke shell sebagai perintah.
Artikel Terkait Lainnya :
- Wajib Tau Buat Kamu Yang Ingin Belajar Tipe Data Di Dalam Ilmu Statistik
- Simak Dulu Sebelum Memulai Karir Menjadi Seorang Copywriter
- Cara Deploy Aplikasi Di Digital Ocean
- Intip Gaji Software Engineer Di Beberapa Startup Terkenal Di Indonesia
- Ini Dia Bedanya Cloud Hosting Dengan Virtual Private Server