end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

Digest::MD5 による暗号化とファイル比較

itproに川合 孝典さんによるperl入門が掲載されていました。

http://itpro.nikkeibp.co.jp/article/COLUMN/20080528/304551/

Digest::MD5をinstallしたことはありましたが、これまであまり利用していなかったので、これを試してみます。

perl入門の記事では Digest::Perl::MD5 が紹介されていましたが、私の周りではDigest::MD5の方をよく見かけるので、今回はDigest::MD5を使用します。

一方向暗号とは

一方向暗号では暗号化したものを元の内容には戻せません。
一方向暗号化にはMD5SHA1といったhash関数があり、これらは任意の長さのデータを16バイト(md5),20バイト(sha)でdigest(要約)を作成します。
当然、digestから元の値を類推できません。

Digest::MD5 を使う

Digest::MD5 の使用方法はcpan等にあるドキュメントを読めば十分だと思います。
http://search.cpan.org/search?query=Digest%3A%3AMD5&mode=all

文字列の16進digestを取得するには次のように行い、例えば、これはpasswdの暗号化に使用します。

#!perl   #in cygwin

use strict;
use warnings;

use Digest::MD5;

my $ctx = Digest::MD5->new;

my $str = 'A' x 1024;
$ctx->add($str);

print  $ctx->hexdigest,"\n";
$ test.pl
d47b127bc2de2d687ddc82dac354c415


同様にfileの16進digestを取得するには次のように行い、例えばダウンロードしたファイルの比較に使用します。

#!perl  #in cygwin

use strict;
use warnings;

use Digest::MD5;

sub main {
    my ($file_path) = @_;

    my $ctx = Digest::MD5->new;

    open my $fh, "<$file_path";
    $ctx->addfile($fh);
    print  $ctx->hexdigest,"\n";
    close($fh);
}

main(@ARGV);
$ ./foo2.pl foo.txt 
e7be80991023d61a0f40849d065962e6