メッセージダイジェストを取得するコマンド

id:ha-tan:20051026:1130255822と同じようなアイディアで、Rubyに取り込まれているメッセージダイジェストの機能を簡単なスクリプトで呼出せるようにしてみました。ファイル名を「md5」「sha1」「sha256」「sha384」「sha512」とすることで、ファイル名に相当するメッセージダイジェストを計算することができます。

#!/usr/bin/env ruby
# -*- ruby -*-

alg = File.basename($0).upcase
case alg
when 'MD5'
  require 'digest/md5'
when 'SHA1'
  require 'digest/sha1'
when /^SHA(?:256|384|512)$/
  require 'digest/sha2'
else
  $stderr.puts "invalid filename: #{alg}"
  exit 1
end

ARGV.each do |filename|
  digest = Digest.const_get(alg).new
  open(filename, 'r') do |file|
    while buf = file.read(1024)
      digest.update(buf)
    end
  end
  puts "#{alg} (#{filename}) = #{digest.hexdigest}"
end

実行例:

$ ./sha256 /bin/ls
SHA256 (/bin/ls) = fbe58b641a2f6dd9bf1bbf963331d07c4cc09546084549e24a89757cb793f60a

NetBSD-2.0.2にはsha256以上を扱えるコマンドが入っていない(と思う)ので、それなりに使えるかも。
sha256以上はOpenSSLも0.9.8系からなんですよね(NetBSD-2.0.2には0.9.7系が入っています)。