8

メールを送信するためにSMTP サーバーに接続する必要があるPerl スクリプトを書いていますが、この種のことは本当に好きではありません。

my $pass = '123456';

そして、 Data::Encryptedを見つけました。これにより、ユーザーは初めてプロンプトを表示し、暗号化して保存できるようになります。

use Data::Encrypted file => ".passwd", qw(encrypted);
my $password = encrypted('password');

しかし、私はそれを機能させることができません.実行時エラーが発生します:

/Library/Perl/5.12/Data/Encrypted.pm 行 78 の不正なキー ファイル形式

誰かが同じ問題を抱えているか、パスワードを非表示/保護する別の方法を知っていますか?

4

4 に答える 4

11

Data::Encryptedモジュールが最後にリリースされたのは 2001 年です。

通常、パスワードを保存することは、暗号化されていても悪い考えだと思います。ただし、別のシステムに接続するためにパスワードを保存する必要がある場合は、パスワードを暗号化することをお勧めします。私がそれを行う方法は次のようなものです:

# Rijndael is also known as AES, which is the encryption standard used by the NSA
use Crypt::Rijndael;
use IO::Prompter;

# This secret is exactly 32 bytes long, you could prompt for this as a
# passphrase or something and pad it with spaces or whatever you need
my $app_secret = 'this_is_the_key_the_app_uses....';

# Setup the encryption system
my $crypto = Crypt::Rijndael->new( $app_secret, Crypt::Rijndael::MODE_CBC() );

# Ask the user to enter the password the first time
my $password = prompt "password: ", -echo => ''; # from IO::Prompter

# Encrypt the password. You can save this off into a file however you need to
my $enc_password = $crypto->encrypt($password);

# Later load it from the file and decrypt it:
my $password = $crypto->decrypt($password);

詳細については、Crypt::RijndaelおよびIO::Prompterを参照してください。

于 2012-08-03T11:44:11.380 に答える
3

ありがとう !これが私の最終的な解決策です:

sub smtp_passwd(){
    #The secret pass phrase
    my $app_secret = 'd.<,3eJ8sh[(#@1jHD829J,Z!*dGsH34';

    #password file name
    my $passwd_file_name = ".passwd";

    # Setup the encryption system
    my $crypto = Crypt::Rijndael->new( $app_secret, Crypt::Rijndael::MODE_CBC() );

    #File Handler
    my $passwd_file;

    #If we cannot open the password file we initiate a new one
    unless ( open ( $passwd_file, '<', $passwd_file_name) ) {

        #Create a new file in write mode
        open ( $passwd_file, '>', $passwd_file_name);

        # Ask the user to enter the password the first time
        my $password = prompt "password: ", -echo => ''; # from IO::Prompter

        #Password must be multiple of 16 (we deliberately chose 16)
        my $pass_length = 16;

        #If password is to short we complete with blank
        $password = $password." "x ($pass_length - length ( $password ) ) if ( length ( $password ) < $pass_length );

        #If password is to long we cut it
        $password = substr ( $password, 0, $pass_length ) if ( length ( $password ) > $pass_length );

        #Encryption of the password
        my $enc_password = $crypto->encrypt($password);

        #we save the password in a file
        print $passwd_file $enc_password;

        #we close the file ( Writing mode )
        close $passwd_file;

        #Reopen the file in reading mode
        open ( $passwd_file, '<', $passwd_file_name)
    }

    #Loading the password en decrypt it
    my $password = $crypto->decrypt( <$passwd_file> );

    #Close the file
    close $passwd_file;

    #Return the password ( Here the password is not protected )
    return $password;
}
于 2012-08-07T08:02:25.933 に答える
3

ユーザーの介入なしにプレーンテキストのパスワードをサービスに送信するスクリプトを扱っている場合、すでに運命づけられています。あなたが持ってくる解決策は、あいまいさによる単なるセキュリティになります。zostayが行ったように、ソリューションを提供できます。しかし、それは最先端のボールトを購入するのと同じですが、キーをマットの下に置いて、「キーのマットをチェックしてください!」というテキストが書かれた紙を貼り付けます。正面玄関へ。ほら、スクリプトをコピーして、パスワードをgrepします。次に、行のようなmy $password = $crypto->decrypt($password);場所を見つけますwarn $password;以下の行で、スクリプトを実行します。それでおしまい。あなたがどのアルゴリズムを使っていようと、パスワードをどこにどのように保存しようと、私は気にしません。あなたは私をもっと難しくすることができますが、クラックしようとする私の努力は、それを難し​​くしようとするあなたの努力よりも常に数桁少なくなります. あなたのスクリプトが鍵です。この映画業界全体を見てください。彼らはばかげたがらくたの束を手に入れるために何十億も費やしました。彼らは特別なハードウェアに行き着き、ケーブルでさえ独自のキーを持っています。陽気な!公正なユーザーのみに嫌がらせをしています。

ばかげて見えたくない場合は、スクリプトにプレーンパスワードを配置します。目立たないようにしてセキュリティを確保したい場合は、変数にわかりやすい名前を付けないでください。標準モジュールを使用しないでください (見てください、メソッドdecryptが手がかりです!)、洗練されたもので時間を無駄にしないでください。パスワードをどのように保存または暗号化するかは調べません。パスワードを使用する必要がある場所を調べて、そこにフックします。隠すのははるかに簡単で、はるかに困難です。

于 2012-08-05T08:12:42.437 に答える
0

これは、上記のコードの一部と Perlmonk から取得した一部を利用した本格的なコードです。スクリプトは、最初にユーザーにユーザー名とパスワードを尋ね、それを暗号化して .crypt ファイルに保存します。次に、それを読み取り、復号化して元のテキストを表示します。2 回目は、既存のユーザー資格情報を使用します。

use Crypt::Rijndael;
use IO::Prompter;
use Crypt::CBC;
#keys
my $key = "a" x 32;
my $cipher = Crypt::CBC->new( -cipher => 'Rijndael', -key => $key );
my @plaintext;
my @ciphertext;
#keys

#filefield
#password file name
#my $file_name = ".crypt";
my $file_name = ".crypt";
#File Handler
my $file;


#If we cannot open the password file we initiate a new one
unless ( open ( $file, '<:encoding(UTF-8)', $file_name) ) { #<:encoding(UTF-8)
#Create a new file in write mode
    open ( $file, '>', $file_name);
    $plaintext[0]= prompt "Username:";
    $plaintext[1]= prompt "Password:", -echo => '';
    print "#################################################################################\n";
    print "# User credentials will be encrypted and stored in .crypt file and same is      #\n"; 
    print "# reused next time.  If you need to add new user credentials delete the .crypt  #\n";
    print "# file and re run the same script.                                              #\n";
    print "#################################################################################\n";
    $plaintext[0]=~ s/^\s*(.*?)\s*$/$1/;
    $plaintext[1]=~ s/^\s*(.*?)\s*$/$1/;


    while($plaintext[0] =~ /^\s*$/){
    $plaintext[0]= prompt "Username is mandatory:";
    $plaintext[0]=~ s/^\s*(.*?)\s*$/$1/;
    }
    while($plaintext[1] =~ /^\s*$/){
    $plaintext[1]= prompt "Password is mandatory:";
    $plaintext[1]=~ s/^\s*(.*?)\s*$/$1/;
    }


    $ciphertext[0] = $cipher->encrypt($plaintext[0]);
    $ciphertext[1] = $cipher->encrypt($plaintext[1]);

    #we save the password in a file
    print $file $ciphertext[0];

    #print $file "\n";
    #we save the password in a file
    print $file $ciphertext[1];
     #we close the file ( Writing mode )
    close $file;

    #Reopen the file in reading mode
    open ( $file, '<', $file_name)
 }


 my @holder;
 my $content;
if (open( $file, '<', $file_name)) {
  #chomp(@holder = <$file>);
 local $/;
    $content = <$file>;

} else {
  warn "Could not open file '$filename' $!";
}
@holder = split(/(?=Salted__)/, $content);
  print "Encrypted username:",$holder[0];
  print "\n";
  print "Encrypted password:",$holder[1],"\n";

 #Loading the password en decrypt it
$plaintext[0] = $cipher->decrypt( $holder[0] );
$plaintext[1] = $cipher->decrypt( $holder[1] );

print "\n\n";

print 'Username is:',"$plaintext[0]\n";
print 'Password is:',"$plaintext[1]\n";
#Close the file
close $file;

#filefield
于 2016-11-22T10:20:18.727 に答える