2007年7月23日月曜日

JAVAでファイルのSHA-1を計算する

ダウンロードしたファイルが正しいかチェックするためにSHA-1のチェックサムを利用していることはよくあることですが、WindowsでSHA-1とかのダイジェストを得るためにはフリーウェアとかを使ったりします。その手のツールは便利でいいのですが、インストールするのが気が引けたりするので、そのくらいならJAVAでさくっとできないものかと思って、とりあえず作ってみました。

とりあえずなので、基本的なコンセプトは以下のような感じ。

Windowsなので結果をウィンドウで表示する
いわゆるメッセージボックスのようなもので計算結果を表示する。
機能は限りなくシンプル
こういうツールを作ろうとすると、いろいろ便利にしたくなるのですが、とりあえずは簡単なものにする。
エラーぐらいは表示
エラーが出ても突っ走って、何も表示されないと悲しいので、エラーメッセージぐらいは表示しようということ。

とりあえず、ソースコードはこちら。ちなみにソースコメントは入れてないです。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.swing.JOptionPane;

public class FileDigest {
 protected static int READ_SIZE = 1024;
 protected static String DIGEST_ALGORITHM = "SHA-1";
 protected static String DIALOG_TITLE = "File Digest Tool";
 protected MessageDigest messageDigest;
 public static void main(String[] args) {
  if (args.length == 0) {
   messageOut("No taget file.", true);
   System.exit(1);
  }
  FileDigest fileDigest = new FileDigest();
  try {
   fileDigest.setFile(args[0]);
  } catch (FileNotFoundException e) {
   messageOut(String.format("File not found (%s).", args[0]), true);
   System.exit(2);
  } catch (IOException e) {
   messageOut("File read error.", true);
   System.exit(3);
  }
  messageOut(fileDigest.digestString(), false);
 }
 public FileDigest() {
  try {
   messageDigest = MessageDigest.getInstance(DIGEST_ALGORITHM);
  } catch (NoSuchAlgorithmException e) {
   System.exit(4);
  }
 }
 public void setFile(String pathName) throws FileNotFoundException, IOException {
  FileInputStream inStream = new FileInputStream(pathName);
  DigestInputStream digestStream = new DigestInputStream(inStream, messageDigest);
  byte readBuffer[] = new byte[READ_SIZE];
  while (digestStream.read(readBuffer) > 0);
 }
 public String digestString() {
  byte codeList[] = messageDigest.digest();
  String digest = new String();
  for (byte code : codeList) {
   digest += String.format("%x", code);
  }
  return digest;
 }
 protected static void messageOut(String message, boolean isError) {
   JOptionPane.showMessageDialog(
     null, message, DIALOG_TITLE, 
     isError ? JOptionPane.ERROR_MESSAGE : JOptionPane.INFORMATION_MESSAGE);  
 }
}
あえてどう使うかという説明をするほどのものではないとは思っているのですが、デスクトップにショートカットをおいて、ドラッグ&ドロップで結果がわかるといいかと思ったので、そうするには以下のようにしてみてください。
ソースをコンパイルして.classファイルを作成
その方法は説明するまではないと思いますが、普通にやれば「FileDigest.class」というファイルができるはず。
デスクトップにショートカットを作成
explorerで右クリックして、「送る」のサブメニューのデスクトップを選択する。
できあがったショートカットのプロパティを表示
リンク先の変更
このときリンク先は、FileDigest.classのフルパスになっているので、「javaw FileDigest」(FileDigest.classではない)に変更する。 作業フォルダはそのままにしておく(CLASSPATHの代わり)。

これで、ショートカットから、ツールが起動できるはず。うまくいけば、アイコンがJAVAのものに変わる。 ちなみに単にそのショートカットで起動すると「No target file.」と書いてあるメッセージボックスが表示されます。ダイジェストを計算したいときは、explorerからこのショートカットへドラッグ&ドロップすると、計算結果がメッセージボックスで表示されます。

0 件のコメント: