• ベストアンサー

MessageDigestについて

JavaではMessageDigestを利用して"MD5"や"SHA1"のような暗号化を行う事が出来ますが、これらで作成したハッシュ値はbyte[]型になっていて、表示するにはちょと問題があるかと思います。 そこでご質問ですが、MessageDigestで作成したハッシュ値を表示に適した文字に変えるようなAPIは存在するのでしょうか? よく"md5=990e8673jy8328968hu…"のような形になっているのですが、どのように文字列を作成しているのかが分かりません。 ご存知の方がおられましたら、ご回答お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

これは実際MD5うんぬんの話ではなくて、byte値を16進文字列にする話やね。それにはえっちらおっちら変換しないといけない。サンプルを用意したので参考にして欲しい。 import java.security.*; public class Md5 { public static void main(String[] args) { byte[] digest; try { digest = MessageDigest.getInstance("MD5").digest(args[0].getBytes()); } catch(NoSuchAlgorithmException e) { // MD5が無い時 System.out.println("MD5なんて無い"); return; } catch(Exception e) { // それ以外の例外 System.out.println("usage: java Md5 ハッシュする文字"); return; } StringBuffer sb = new StringBuffer(); for(int i = 0; i < digest.length; i++) { sb.append(Integer.toHexString((digest[i] >> 4) & 0x0f)); // 上位ニブルを1文字へ sb.append(Integer.toHexString( digest[i] & 0x0f)); // 下位ニブルを1文字へ } String s = new String(sb); System.out.println(s); } }

ryvius
質問者

お礼

なるほど、あの文字列はbyte値を16進文字列に変換したものなんですね。 サンプルまでお教え頂いてありがとうございます。 参考にしてプログラムを作ってみたいと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 短いハッシュの作り方

    特に言語には関係がないのでこのカテゴリに。 md5やsha1でハッシュを作ると、32桁か40桁で大文字小文字の区別がないものとなります。 以下のような短いハッシュはどのように作るのでしょうか。 http://am6.jp/asRleJ http://twitpic.com/12zs0a http://bit.ly/axe7hu

  • 一意(ユニーク)かつ、ソートに対してランダムなIDの発行方法

    随時増加するあるデータに対して、一意なIDを割り当ててゆきます。 通常は、1, 2, 3, … と連番を割り当てて行けば一意なIDになると思います。 その上で、IDでソートした時に発行順に並ぶのではなく、順番がランダムになるようにしたいのです。 (アルゴリズムを知らない人から、発行順を推測されないようにしたい。) そこで考えたのが、"1", "2", "3", …という文字列に対するハッシュ(SHA1やMD5)ですが、sha1("1"), sha1("2"), sha1("3"), …とIDを発行していった場合、IDが重複してしまう可能性を心配しています。(とても低い確率ではあることは分かっていますが、皆無ではありません。) ハッシュ関数を利用する他に、「一意」で「ランダム」で「衝突の可能性がゼロ」である文字列の生成方法はありませんでしょうか?(可能性がゼロというのは物理的に不可能だと思うので、例えばSHA-1であれば、160bitのハッシュが生成されますが、2^160個のIDを発行しても重複しない、ということを考えます。) 一応、規模は1000万ID程度を考えていますが、もっと大きなオーダーでも衝突しないに越したことはありません。

  • パスワードの決め方について(SHA3orHMAC)

    パスワードの決め方や保管の方法について、分からなくなってきたので基本から質問させてください。 1.パスワードをホームページ等でネットに公開したら危険ですか? 2.1.はただそのまま公開したら危険なのでやってはいけないと思いますが、暗号化して、パスワードのパスワードがないと解けない状態にして公開しておけば安全ですか? 3.2.の暗号化の手法として、暗号学的ハッシュ関数を用いて、ハッシュ値 h をパスワードにすれば、暗号化したパスワードを公開しても安全ですか? 4.3.について、パスワードにしたハッシュ値 h を公開したのではパスワードをそのまま公開していることになり、危険なため、ハッシュ値 h を算出する暗号学的ハッシュ関数の実行コマンドをホームページ等で公開し、パスワードを確認したいときにはこのコマンドを実行してハッシュ値を得ることにすれば、安全ですか? 5.4.について、暗号学的ハッシュ関数はSHAシリーズなどがありますが、この実行コマンドは広く一般に利用できる状態で提供されているため(ハッシュ計算するソフトウェアやWebサイトなど)、SHAなど既存の暗号学的ハッシュ関数を用いるのではなく、自分で専用に暗号学的ハッシュ関数を考案し、また実行コマンドやソフトウェアを作成する必要がありますか? 6.5.が大変な場合、SHAなど既存の暗号学的ハッシュ関数を用いて4.を実現するにはどうしたらいいですか? 7.4.について、コマンドがパスワードの数だけ存在すると管理が大変です。コマンドは共通にして、オプションスイッチで区別することはできませんか? 8.7.について、コマンドは既存のソフトウェアをあらかじめインストールしておき、オプションスイッチを含む実行コマンド文のみをHP等で公開しておくことはできませんか? 9.6.7.8を実現するには、オプションスイッチのうちのひとつをパスワードのパスワードとして、このスイッチのみを非公開とすれば良いですか? 10.9.について、コマンド文はどのように記述すれば良いですか?たとえばハッシュ関数H()、出力h、パスワードの対となる文字列(IDとかファイル名等)m、パスワードのパスワードをk、||は結合とした場合、 H(k||m)=h と書けると思いますがこれをH(m)として公開し、kはあらかじめPC等コマンドを実行する環境で設定しておけば良いですか? 11.10について、暗号学的ハッシュ関数SHA2シリーズ(256bit等)を用いた場合、Merkle-Damgård 構造であるため、length-extension 攻撃され、危険ですか? 12.10.11.について、暗号学的ハッシュ関数SHA3シリーズを用いた場合、SHA2シリーズのハッシュ関数と異なりスポンジ構造であるため、length-extension 攻撃は成り立たず、安全ですか? 13.12について、length-extension 攻撃以外の危険性はありますか?

  • レインボーテーブルとはなんですか?

    レイボーテーブルというのはどのようなものなのですか? ハッシュ値から、パスワードを入手するために、簡単な文字列を入れていき、同じハッシュ値になるか確かめるのですか? それともアルファベット順に調べていくのですか? また、同じSHA256でも、ハッシュ化する方法を変えていれば、既存のレインボーテーブルは使えなくなりますか?

  • ファイルのハッシュ値を表示するソフト

    文書ファイル、画像ファイルなどのハッシュ値を表示してくれるソフトってありますでしょうか。 MD5とかSHA-1とかいろんなハッシュ関数に対応しているとうれしいのですが、 おすすめのフリーソフトがありましたら教えて下さい。

  • SHA1ハッシュの生成結果が異なる理由とは

    Windows で Digest::SHA1 というモジュールを使って 文字列のSHA1ハッシュを生成するプログラムを作ったのですが、 $x = <STDIN>; と書き、100 と入力して生成したハッシュと、 あらかじめ $x = 100; のように設定しておいて生成したハッシュとでは、内容が異なっています。 前者は 310b86......、後者は 6a2903...... と出ます。 これはなぜでしょうか? 一致させるにはどうすれば良いのでしょうか。 ご教示ください。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • パスワードのハッシュ化について

    ユーザー登録させるようなwebサイトを作ることになりました。 ググッたところパスワードはハッシュ化させDBへ、っていうのが通常らしいんで、 sha256を使って変換しようと思います。 質問(1)ハッシュ化させる元の文字列には文字数など何か制限はないんでしょうか。 質問(2)ハッシュ化させるときにくっつけるsaltは何桁くらいにするのが一般的なんでしょうか。 教えてください。

  • 8文字以上の文字を暗号化する方法

    Apache1.3.37+PHP5.2.4+MySQL51.22のレンタルサーバでWEBコンテンツを作っています。 フォームから入力されたパスワードを、DBに格納する際、暗号化したいと思います。 MD5やsha1やcryptなどいろいろあるのですが、8文字を超える文字の暗号化ができないようです。 8文字を超える暗号化はどうすればいいのでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • 画像ファイルをリクエストパラメータとして送信

    あるAPIを実行しようとしているのですが担当者不在のため質問させていただきたく思います。 javaにてあるAPIを実行するときに画像ファイルをリクエストパラメーターとして送信しようとしています。 つまり下記URLのfileパラメータに相当する文字列を作成しようとしております。 http://www.exe.api?file=xxxyyyyzzz fileパラメータは  「マルチパートデータ+Base64」 の形式で送信するらしいのですがここでいうマルチパートデータってどいういう状態 (Javaでいうところのどういう型)のことでしょうか。 現在、Struts2を使用しているのですがサーバー側ではクライアントから送信されてきた画像ファイルを Fileオブジェクトとして受け取っておりFileオブジェクトをBase64文字列に変換して上記のAPIを 実行してみたのですがどうもうまくいかなかったので質問してみました。

    • ベストアンサー
    • Java
  • セキュリティプログラミング??

    セキュリティプログラミングというのはどういうことなのでしょうか? 秘密鍵ファイルと、 メッセージ(データ)ファイルを元に、 MD5やSHA-1などのハッシュ関数APIを呼んだり、 SSL/TLS や SSH の接続のためのAPIを呼んだりということなのでしょうか? sqlインジェクション対策や、クロスサイトスクリプティング対策、ブルートフォース対策をするというのも、セキュリティプログラミングに分類されるのが一般的でしょうか? .