Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > crypt пароля


Автор: izek 28.1.2007, 14:02
Мне нужно закриптовать пароль с помошью MD5 и как это сделать?помогите плиз! я знаю что там надо использовать crypt

Автор: JAPH 29.1.2007, 13:36
Причём тут crypt?
Код

use MD5;
print MD5->hexhash('parol');

Автор: izek 29.1.2007, 20:34
а как в переменную загнать?

Автор: izek 29.1.2007, 20:57
а всё понял!туплю сорри

Добавлено @ 21:07 
а обратно не как нельзя сконвертировать?

Автор: JAPH 29.1.2007, 22:16
В смысле обратно? По MD5 восстановить строку? Никак.
Этот алгоритм предназначен для одностороннего хеширования.
Изменение любого символа сильно влияет на хеш, а подобрать две строки с одинаковыми MD5-хешами очень сложно.

Автор: nitr 29.1.2007, 22:19
izek, нет smile сравнивай хеши smile
т.е. свой и с чем сравнить хочешь smile думаю для этого обратно хочешь ;) ?

Автор: korob2001 30.1.2007, 10:55
Если хочешь криптовать с последующим востановлением, юзай Crypt::CBC.

Вот пример из стандартной документации.
Код

#!/usr/bin/perl -w
use strict;
use Crypt::CBC;

my $password = "top_secret";

my $cbc = Crypt::CBC->new(
    -key => 'mykey',
    -cipher => 'Blowfish',
);

# Криптуем, сохраняем в переменную и выводим в STDOUT
my $secret_passwd = $cbc->encrypt($password);
print $secret_passwd."\n";

# Декодируем и выводим в STDOUT
print $cbc->decrypt($secret_passwd)."\n";

Автор: Materium 30.1.2007, 19:11
А вот это зачем и что делает можно вопрос:

Код

-key => 'mykey',
-cipher => 'Blowfish',

Автор: Nab 30.1.2007, 20:38
Это передача именованных параметров конструктору объекта...

Автор: Materium 31.1.2007, 17:18
Nab, ну это я понимаю. ))) что из этого следует? зачем это? можно вместо "mykey" написать "keymy"??? Что должно стоять вместо этих именованых параметров?
почему просто нельзя:??

Код

my $cbc = Crypt::CBC->new();


извините конечно за тупой вопрос.

Автор: sergejzr 31.1.2007, 17:28
Первое - ключ, втрое алгоритм.
Ключ нужен чтобы де/шифровать пароль. 
Алгоритм - потому что путей де/шифровки множество и надо всё таки выбрать один.

Чуть - чуть подумать и самому станет ясно smile

Автор: Materium 31.1.2007, 18:35
читать доку нужно. но тут бывает проще и быстрее. тебе что-то скажут, ты что-то скажешь и всё проблемы.

Автор: korob2001 31.1.2007, 18:52
Вот ещё нашёл на винте небольшой рабочий пример. Давно, как-то писал.
Код

#!C:/Perl/bin/Perl.exe
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#    Author: Denis Korobov               #
#    E-mail: [email protected]         #
# Copyright: All rights fucked up. ;)    #
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
use Digest::MD5;
use Crypt::CBC;
use Crypt::Blowfish;

my $self = {};
$self->{md5} = Digest::MD5->new();

print "X" x 79, "\n\n";
print win_to_dos("Привет! Вас приветствует программа шифрования данных.") . "\n";
print win_to_dos("Следуйте указаниям программы и будет вам счастье. ;))") . "\n\n";
print "X" x 79, "\n\n";
while ( 1 ) {
        print win_to_dos("Укажите путь к файлу с сообщением: ");
        chomp( $self->{file} = <STDIN> );
        if ( $self->{file} =~ /^\s*$/ ) {
             print win_to_dos("Ошибка: вы не указали путь к файлу.") . "\n";
        } elsif ( !-e $self->{file} ) {
             print win_to_dos("Ошибка: файл '" . $self->{file} . "' не существует.") . "\n";
        } else {
             last;
        }
}

print "x" x 79, "\n\n";
while ( 1 ) {
        print win_to_dos("Укажите действие:\ncrypt - шифровка\ndecrypt - расшифровка\n");
        chomp( $self->{action} = lc( <STDIN> ) );
        if ( $self->{action} !~ /^(?:de)?crypt$/i ) {
             print win_to_dos("Не верно задано действие.") . "\n";
        } else {
             last;
        }
}

print "x" x 79, "\n\n";
while ( 1 ) {
        print win_to_dos("Укажите ключ");
        print win_to_dos(" (можете оставить пустым, программа сделает это за вас)") if $self->{action} eq "crypt";;
        print ":\n";
        chomp($self->{key} = <STDIN>);
        if (($self->{action} eq "decrypt") and !$self->{key}) {
              print win_to_dos("Вы не указали ключ, вы можете это делать только для шифрования, но не обратного действия.") . "\n";
              next;
        } elsif (($self->{action} eq "crypt") and !$self->{key}) {
              $self->{key} = keyGenerator(10);
        }
        last;
}

$self->{cbc} = Crypt::CBC->new($self->{key}, "Blowfish");

$self->{filename} = (split(/\\|\/|\:/, $self->{file}))[-1];

open(R, "<" . $self->{file}) or die win_to_dos("Не удалось открыть файл для чтения: $!\n");
my @data = <R>;
close(R) or die win_to_dos("Не удалось закрыть файл: $!\n");
$self->{file} =~ s/$self->{filename}$/$self->{action} . "_" . $self->{filename}/e;

open(W, ">" . $self->{file}) or die win_to_dos("Не удалось открыть файл для записи: $!\n");
flock(W, 2);

if ( $self->{action} eq "crypt" ) {
     print W encoder(@data);
} else {
     print W decoder(@data);
}

close( W ) or die win_to_dos("Не удалось закрыть файл: $!\n");

print "=" x 79, "\n";
if ( $self->{action} eq "crypt" ) {
     print win_to_dos("Зашифрованное данные сохранены в файле '" . $self->{file} . "'.") . "\n";
     print win_to_dos("ВНИМАНИЕ! Для того, что бы человек смог прочесть зашифрованные данные,") . "\n";
     print win_to_dos("вы должны передать ему следующий ключь: " . $self->{key} . ".") . "\n";
     print win_to_dos("Иначе он не будет иметь возможности, прочесть ваше твоерение. ;)") . "\n";
} else {
     print win_to_dos("Дешифрованные данные, вы можете прочесть в файле: ") . "\n";
     print $self->{file}. "\n";
}
print "=" x 79, "\n\n";
print win_to_dos("Для выхода нажмите ENTER...");
<>;

sub encoder {
    my @val = @_;
    my $sum;
    $self->{md5}->add(join("", $self->{key}, @val));
    $sum = $self->{md5}->hexdigest();
    return($self->{cbc}->encrypt_hex(join("µ", $sum, @val)));
}

sub decoder {
    my $code = shift;
    my($sum, $sum2, @val) = ();
    ($sum, @val) = split("µ", $self->{cbc}->decrypt_hex($code));
    $self->{md5}->add(join("", $self->{key}, @val));
    $sum2 = $self->{md5}->hexdigest();
    return ($sum eq $sum2) ? @val : ();
}

sub keyGenerator {
    my $col   = shift || 10;
    my @chars = ('A'..'Z', 0..9);
    return join('', @chars[ map { rand @chars }( 1..$col ) ]);
}

sub win_to_dos {
    my $str = shift;
    $str =~ tr/\300-\377\250\227/\200-\257\340-\361/;
    return $str;
}

__END__;

Может кому пригодится.

Автор: Materium 31.1.2007, 19:39
Ага, ну вот, теперь вовсе понятно что ключ - это набор символов (типа пароля) для раскодирования.
А Blowfish - один из алгоритмов кодирования\раскодирования.

Объяснять хорошо - это целая наука!  smile

Добавлено @ 19:40 
sergejzr ты объяснил как надо, это не к тебе относится а вообще. ;) 

Автор: izek 2.3.2007, 14:29
Пасибо!Тока заглянул  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)