Шифрование / дешифрование в perl

#perl #encryption

#perl #шифрование

Вопрос:

Я пытаюсь сделать скрипт несколько более удобным для пользователя, поскольку он каждый раз просит меня вводить мой пароль. Я хочу ввести пароль, записать его в зашифрованный файл и прочитать его обратно в расшифрованном виде.

Я погуглил это здесь, поэтому попытался ввести это. К сожалению, decode_base64 не возвращает введенный мной пароль.

Я надеялся, что будет очень простой способ шифрования / дешифрования в perl. Кто-нибудь может мне помочь?

Для справки, изменения, которые я внес

шифрование:

 my $msg = "Enter password for ".$ENV{'USERNAME'}.": ";
UTILS_print( $msg );
# Do not show the password 
ReadMode('noecho');
chomp($password = ReadLine());
ReadMode('normal');

# Store encrypted password 
if (open(FILE, '>', "$pwdFile")) {
    
    my $hidden = crypt $password, join "",  
        ('.', '/', 0..9, 'A'..'Z', 'a'..'z') [rand 64, rand 64]; 
    print FILE $hidden;
    close(FILE);
}
  

расшифровать:

 # Use a stored password when no password is set during start of script
my $pwdFile = 'c:/Localdata/nexus_upload_'.$ENV{'USERNAME'}.'.pwd';
if ( $password eq '' ) {
    if ( -e "$pwdFile"  ) {
        if (open(FILE, "$pwdFile")) {
            my @lines = <FILE>;
            close(FILE);
            $password = $lines[0];
            chomp $password;
            $password = decode_base64($password);
        }
    }
}
  

Ответ №1:

Из документации к crypt() функции:

зашифровать ОТКРЫТЫЙ ТЕКСТ, СОЛЬ

Создает строку дайджеста, точно такую же, как функция crypt(3) в библиотеке C (при условии, что у вас действительно есть версия, которая не была удалена как потенциальный боеприпас).

crypt является односторонней хэш-функцией. ОТКРЫТЫЙ ТЕКСТ и СОЛЬ превращаются в короткую строку, называемую дайджестом, которая возвращается. Один и тот же ОТКРЫТЫЙ ТЕКСТ и СОЛЬ всегда будут возвращать одну и ту же строку, но нет (известного) способа получить исходный открытый ТЕКСТ из хэша. Небольшие изменения в ОТКРЫТОМ ТЕКСТЕ или СОЛИ приведут к большим изменениям в дайджесте.

Нет функции дешифрования. Эта функция не так уж полезна для криптографии (для этого поищите модули Crypt в вашем ближайшем зеркале CPAN), а название «crypt» немного неправильно. Вместо этого он в основном используется для проверки, совпадают ли два фрагмента текста, без необходимости передавать или сохранять сам текст. Примером является проверка правильности ввода пароля. Сохраняется дайджест пароля, а не сам пароль. Пользователь вводит пароль, который зашифрован с той же солью, что и сохраненный дайджест. Если два дайджеста совпадают, пароль правильный.

Обратите внимание, что там написано «Нет функции дешифрования».

Веб-страница, с которой вы получаете этот код, несет чушь. Если вы запустите пример кода с этой страницы, вы получите этот вывод:

 Encrypted Password :: B2rm1NvmFuLww
Decrypted Password :: j������
Password In Plain Text :: GeeksforGeeks
  

Это не работает.

decode() Функция из MIME::Base64 является обратной encode() функции из того же модуля. Вы могли бы использовать это, чтобы «замаскировать» свой пароль в файле на вашем диске, но это, конечно, не шифрование, и оно действительно не добавит никакой безопасности.

В качестве альтернативы, следуйте рекомендациям в документации и посмотрите на модули в пространстве имен «Crypt».

Комментарии:

1. Ах, хорошо, это объясняет, почему у меня это не работает. Спасибо за объяснение! Я посмотрю на модуль Crypt. Спасибо