Outils pour utilisateurs

Outils du site


programmation_perl

Crypt

Liens:

But: comparer et construire des clés “crypt”…

Voila:

#!/usr/bin/perl -w

use strict;
use warnings;

{
# From package: libauthen-simple-passwd-perl
#
use Authen::Simple::Password;

# Où:
# password = mot de passe saisie (en clair)
# encrypted = le hash recupéré dans une base (ou fichier shadow ...)
# Exemple:
# encrypted format:
# $<format>$<salt>$<hash>
# $1$12345678$1234567890123456789012
# ou $6$12345678$xxxxxxxxxxxxxxx...
sub check_password
{
  my ( $password , $encrypted ) = @_;
  return Authen::Simple::Password->check($password,$encrypted);
}
}

# Créer de la poussiere
# 8 caracteres aléatoires

sub crypt_salt
{
my $salt = `( date +%s%N ; ps aux ) | md5sum | openssl base64`;
return substr( $salt, 0, 8 );
}

{
# From package: libcrypt-unixcrypt-perl
#
use Crypt::UnixCrypt;

sub crypt_password
{
  my ( $p , $s ) = @_;
  if ( !defined( $s ) ) {
    # Créer la poussiere
    $s = '$6$' . crypt_salt();
  }
  return crypt($p,$s);
}
}

# --------------------------------------
# Chiffrement crypt : $1$salt45678
# Chiffrement sha512 : $6$salt45678   (par defaut)
#
# le "salt" est créé de façon pseudo aléatoire.
# --------------------------------------

{
# -----------------------------
# Coder un mot de passe
# -----------------------------

my $c_password = 'M0t2P4ss3';
my $e_password = crypt_password( $c_password );

print "Mot de passe en clair: $c_password\n";
print "Devient chiffré en sha512: $e_password\n";

# ----------------------------
# Vérifier mot de passe
# ----------------------------

print "Vérification du mot de passe : " ,  check_password( $c_password, $e_password ) ? 'OK':'**Erreur**' , "\n" ;

# ----------------------------
}

Test:

./cryptdemo.pl 
Mot de passe en clair: M0t2P4ss3
Devient chiffré en sha512: $6$OGViYWMx$M8GagcogWG18BoF7qVpgczE9ArxrFQk5YcAnqbiBAuWni37MVYG.GDT57Isy.3Z3qTVFCMn2UbB8nFLKrQA/n1
Vérification du mot de passe : OK

Random Quantum

Install

Une vraie source aléatoire en ligne: http://jve.linuxwall.info/blog/index.php?post/2011/03/04/Quantum-Random-Bit-Generator-Service

Créer un compte par là: http://random.irb.hr/

Récupérer les sources perl d'un module par là: http://search.cpan.org/~egor/Random-Quantum-0.04/

Pré-requis:

# aptitude install libmoose-perl
$ perl Makefile.PL
$ make
$ make test
# make install
Installing /usr/local/share/perl/5.10.0/Random/Quantum.pm
Installing /usr/local/man/man3/Random::Quantum.3pm
Writing /usr/local/lib/perl/5.10.0/auto/Random/Quantum/.packlist
Appending installation info to /usr/local/lib/perl/5.10.0/perllocal.pod

Test

Petit test:

#!/usr/bin/perl -w

use strict;
use warnings;

use Random::Quantum();

{
  if ( my $cl = new Random::Quantum(user => '<COMPTE>', 'password' => '<MOT_DE_PASSE>') ) {
    print $cl->int1 , "\n"; 
    print $cl->int1 , "\n";
    print $cl->int4 , "\n";
    print sprintf("%08X",$cl->int4) , "\n"; 
    my $h = unpack( "H*", $cl->chunk(18) );
    print "At last: $h\n";
  }
}

Exemple:

$ ./test.pl 
196
222
3806413886
2591528E
At last: 508757233b068245788774a4c94cfcdc5b74

Ca “lag” un peu… un problème de DNS ?

pwgen

Ftp SSL

Installer d'abord le package 'ssleay':

# apt-get install libnet-ssleay-perl

Et puis enfin:

# cpan -i IO::Socket::SSL
# cpan -i Net::FTPSSL

Parce que 'cpan' ne peut pas installer le module 'ssleay'.

Tips

DateTime

Des dates a comparer… mais localtime et time c'est vraiment trop pourri…

Il faut utiliser le formidable module DateTime .

Liens

module

On peut l'installer comme cela:

# aptitude install libdatetime-perl

basic

#!/usr/bin/perl -w

use strict;
use warnings;

use DateTime;

{
  my $dt_now = DateTime->now();
  my $dt_loin = DateTime->new( year => 2009, month => 12, day => 1 );
  my $nbdays = $dt_loin->delta_days( $dt_now )->delta_days;

  print "jours: ", $nbdays, "\n";
}

Où:

  • $dt_now , c'est la DateTime (dt) de maintenant
  • $dt_loin , c'est une date composé, loin dans le temps.

Attention: faire un calcul (soustraction pour exemple), c'est créé un objet “duréé” (duration) !
Donc:

  • $dt_now-$dt_loin donne une “duration”.
  • $dt_loin→delta_days( $dt_now ) donne une “duration” aussi.

Pour avoir le nombre de jours de “duration” (toujours par exemple), il faut appeler la méthode delta_days (sans paramètre!).

:!: mais il faut l'appeler correctement , chose loin d'être evidente !

Et voila le résulta:

23

Oui, on est la veille de Noël !

:!: ( $dt_now - $dt_loin )→delta_days , contre toutes évidences, ne renvoit pas le nombre de jours entre 2 dates !
Ca renvoi le nombre de jours entre 2 jours, sans tenir compte du mois ou de l'année…

Nombre de secondes...

my $dt_now = DateTime->now();
my $dt_loin = DateTime->new( year => 2009, month => 12, day => 1 );
my $nbsec = $dt_now->subtract_datetime_absolute( $dt_loin ) -> delta_seconds;
print "secondes: ", $nbsec , "\n";
print "jours: ", int($nbsec/(24*3600)) , "\n";

Resultat:

secondes: 3775448
jours: 43

On peut aussi créer 2 dates avec un écart de 100 jours, comme cela:

my $dt_end = DateTime->now();
my $dt_start = $dt_end - DateTime::Duration->new( days => 100 );

en bref

do

Lien: http://www.tinybox.net/astuces/programmation/perl/love-love-my-do

On peut faire:

my $var = do { 34 };

Mais aussi:

my $var = do { 
  print "bonjour";
  if ( defined($ARGV[0]) ) { $ARGV[0]; }
  else { "rien de rien"; }
};
programmation_perl.txt · Dernière modification : 2011/10/11 21:19 de thierry