2012-08-03 18 views
5

मैं एक पर्ल स्क्रिप्ट आदेश में एक मेल भेजने के लिए एक एसएमटीपी सर्वर से कनेक्ट करने की जरूरत है कि लिख रहा हूँ से पासवर्ड की रक्षा, लेकिन मैं वास्तव में इस तरह का पसंद नहीं है बातें:मैं कैसे छिपा सकता है/एक पर्ल स्क्रिप्ट

my $pass = '123456'; 

और मैंने पाया डाटा :: एनक्रिप्टेड, कि उपयोगकर्ता इसे पहली बार संकेत है और फिर इसे एन्क्रिप्टेड स्टोर करने के लिए अनुमति चाहिए।

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

लेकिन मैं यह काम नहीं कर सकते हैं, यह एक चल टाइम त्रुटि बनाता है:

बुरा कुंजी फ़ाइल स्वरूप /Library/Perl/5.12/Data/Encrypted.pm लाइन पर 78

क्या किसी को भी एक ही समस्या है, या पासवर्ड को छिपाने/संरक्षित करने के लिए एक और तरीका पता है?

+3

भले ही यह काम करता है, तो आप इसे कैसे डिक्रिप्ट करने जा रहे हैं? – pavel

+0

शायद 'md5' आपको मदद करेगा, योग और सभी की जांच करेगा ... – gaussblurinc

+0

हाँ, मैं इसे भी देखता हूं। समस्या में है [क्रिप्ट :: आरएसए :: कुंजी :: निजी :: एसएसएच :: deserialize लाइन 68] (https://metacpan.org/source/VIPUL/Crypt-RSA-1.99/lib/Crypt/RSA/Key /Private/SSH.pm#L68)। 'croak" खराब कुंजी फ़ाइल प्रारूप "जब तक $ id eq PRIVKEY_ID;' ** $ id ** '----- BEGIN आरएसए निजी कुंजी -----', ** PRIVKEY_ID ** 'एसएसएच निजी कुंजी फ़ाइल है फॉर्मेट 1.1'। – daxim

उत्तर

8

Data::Encrypted मॉड्यूल 2001 में अंतिम बार जारी किया गया था। मैं कहूंगा कि इसका उपयोग करने के लिए यह एक अच्छा संकेत है।

आम तौर पर, मैं कहूंगा कि पासवर्ड संग्रहीत करना भी एक बुरा विचार है, यहां तक ​​कि एन्क्रिप्टेड भी है। हालांकि, अगर आपको किसी अन्य सिस्टम से संपर्क करने के लिए पासवर्ड स्टोर करना होगा, तो इसे एन्क्रिप्ट करने का तरीका है। Crypt::Rijndael अधिक जानकारी के लिए

# 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); 

देख सकते हैं और IO::Prompter: जिस तरह से मैं इसे करना होगा कुछ इस तरह है।

+1

विषय से थोड़ी दूर, लेकिन आप इसके साथ क्या हासिल करते हैं? अगर आप पासफ्रेज़ के लिए संकेत देते हैं, तो आप सीधे पासवर्ड के लिए भी संकेत दे सकते हैं। और यदि आप पासफ्रेज़ को हार्ड कोड करते हैं, तो यह आपके 'एन्क्रिप्टेड' पासवर्ड को छिपाने में ज्यादा मदद नहीं करता है। या मुझे कुछ याद आ रहा है? – pavel

+0

आपको पासफ्रेज़ के लिए संकेत नहीं देना है, यह इसे और अधिक सुरक्षित बनाने का एक संभव तरीका है। साथ ही, यदि सुरक्षा के लिए कई पासवर्ड हैं, तो एकाधिक पासवर्ड की तुलना में एक पासफ्रेज़ टाइप करना और याद रखना आसान है। – zostay

+0

यहां तक ​​कि पासफ्रेज के बिना और एक अलग फ़ाइल में या यहां तक ​​कि स्क्रिप्ट में ऐप रहस्य को संग्रहीत करने के बावजूद, आप किसी को गलती से अपने असली एसएमटीपी पासवर्ड को अनजाने में पढ़ने से बच सकते हैं। अगर कोई पासवर्ड फ़ाइल चोरी करने में सक्षम है, लेकिन ऐप को गुप्त नहीं मिलता है, तो आपको पासवर्ड चोरी होने और पासवर्ड क्रैक होने के बीच देरी हो जाती है। जहां तक ​​सुरक्षा जाती है, यह बहुत पतली है, लेकिन यह कुछ भी नहीं है। – zostay

2

जब आप किसी स्क्रिप्ट से निपट रहे हैं जो बिना किसी उपयोगकर्ता इंटरैक्शन के सेवा के सादा पाठ पासवर्ड भेज रहा है, तो आप पहले ही बर्बाद हो चुके हैं। आप जिस भी समाधान के साथ आएंगे वह अस्पष्टता से केवल सुरक्षा होगी। आप zostay के रूप में समाधान के साथ आ सकते हैं। लेकिन यह सबसे उन्नत वॉल्ट खरीदने के बराबर है लेकिन पाठ के साथ चटाई के नीचे कुंजी और कागज चिपकाने के बराबर है: "कुंजी के लिए चटाई की जांच करें!" सामने के दरवाजे पर। देखो, मैं सिर्फ पासवर्ड के लिए स्क्रिप्ट, grep की प्रतिलिपि बनाउंगा। तो मुझे my $password = $crypto->decrypt($password); जैसी लाइन मिलेगी और warn $password; बस नीचे दी गई रेखा पर और स्क्रिप्ट चलाएं। बस। मुझे परवाह नहीं है कि आप किस एल्गोरिदम का उपयोग करते हैं, मुझे परवाह नहीं है कि आप कहां और कैसे पासवर्ड स्टोर करते हैं। आप मुझे इसे कठिन बना सकते हैं, लेकिन क्रैक करने का मेरा प्रयास हमेशा कठिन बनाने के आपके प्रयास से कम परिमाण का एक क्रम होगा। आपकी स्क्रिप्ट कुंजी है। इस फिल्म उद्योग को देखो। उन्होंने मूर्खतापूर्ण बकवास के गुच्छा के साथ अरबों खर्च किए। वे विशेष एचडब्ल्यू के साथ समाप्त हो गए, यहां तक ​​कि केबल की अपनी कुंजी भी है। प्रफुल्लित! यह केवल उचित उपयोगकर्ताओं को परेशान कर रहा है।

यदि आप मूर्खतापूर्ण दिखना नहीं चाहते हैं तो स्क्रिप्ट में सादा पासवर्ड रखें। यदि आप अस्पष्टता से सुरक्षा के साथ जाना चाहते हैं तो समझदार नामों के साथ चर नाम न करें, किसी भी मानक मॉड्यूल का उपयोग न करें (देखें, विधि decrypt सुराग है!) और परिष्कार के साथ अपना समय बर्बाद न करें। मैं नहीं देखूंगा कि आप पासवर्ड को कैसे स्टोर या एन्क्रिप्ट करते हैं, मैं देखता हूं कि आपको इसका उपयोग कहां करना होगा और वहां हुक करना होगा। यह छिपाने के लिए बहुत आसान और कठिन है।

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; 
} 
0

यहाँ पूर्ण विकसित कोड जो ऊपर और Perlmonk से लिया भाग उल्लेख किया कोड का हिस्सा इस्तेमाल करता है: यहाँ मेरा अंतिम समाधान है। स्क्रिप्ट पहले उपयोगकर्ता से उपयोगकर्ता नाम और पासवर्ड पूछता है, इसे एन्क्रिप्ट करता है और इसे .crypt फ़ाइल में संग्रहीत करता है। फिर इसे पढ़ता है, डिक्रिप्ट करता है और मूल पाठ दिखाता है। दूसरी बार यह मौजूदा उपयोगकर्ता प्रमाण-पत्रों का उपयोग करेगा।

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 
संबंधित मुद्दे