Cara Mengambil Kata Sandi Tersembunyi Dari Terminal Di C/C++ - CRUDPRO

Cara Mengambil Kata Sandi Tersembunyi Dari Terminal Di C/C++

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.