• ベストアンサー

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

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

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

  • ベストアンサー
  • xpector
  • ベストアンサー率75% (3/4)
回答No.2

$x = <STDIN> で、$xに代入される値は改行が末尾に含まれるためです。 chompで改行を除去しましょう。 $x = 100; print Digest::SHA1::sha1_hex($x) . "\n"; $data = <STDIN>; chomp($x); print Digest::SHA1::sha1_hex($x) . "\n";

ajrkmkrn
質問者

お礼

ご回答ありがとうございます。 改行の有無だったのですか。納得しました。 chompという関数も初めて知りました。 試してみます。

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

その他の回答 (2)

  • W_H
  • ベストアンサー率47% (21/44)
回答No.3

日本語に限らず、文字入力の決定とか終了の命令を送れるのがエンターキーですが、これは、目には直接見えない[改行]という記号をパソコンに送っています。 これに、ただ決定と言う意味をパソコンが持たせているだけで、本質は改行の記号です。(これからは改行=\nと表記) なので、単純に[100]と入力しても、パソコンが認識するのは、[100\n]となります。 どんなデータにもいえますが、直接データを入力すると、末尾に\nが入ります。 意外にこれを知らないと、プログラミングに多大な影響が出るケースもあります。 \nを消す有効な関数はxpectorさんが書いているので、数字の改行を取り除く方法を書いておきます。 $x+=0; これを入力処理の後に入れてください。数字の場合、計算すれば\nは消えます。数字に影響がないように、0を足しています。

ajrkmkrn
質問者

お礼

大変勉強になりました。 ご回答ありがとうございます。

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

# OO style use Digest::SHA1; my $Digest1; my $Digest1Arg; my $Digest2; my $Digest2Arg; my $Digest3; my $Digest3Arg; my $Digest4; my $Digest4Arg; $Digest1 = Digest::SHA1->new; $Digest1Arg = 100; $Digest1->add($Digest1Arg); print $Digest1->hexdigest; print "\n"; $Digest2 = Digest::SHA1->new; $Digest2Arg = "100"; $Digest2->add($Digest2Arg); print $Digest2->hexdigest; print "\n"; $Digest3 = Digest::SHA1->new; $Digest3Arg = <STDIN>; $Digest3->add($Digest3Arg); print $Digest3->hexdigest; print "\n"; $Digest4 = Digest::SHA1->new; $Digest4Arg = <STDIN>; chomp($Digest4Arg); $Digest4->add($Digest4Arg); print $Digest4->hexdigest; print "\n"; ===== perl Q3189946-1.pl 310b86e0b62b828562fc91c7be5380a992b2786a 310b86e0b62b828562fc91c7be5380a992b2786a 100 6a2903b37751bca2bb4e3ee462092fa957d6cd35 100 310b86e0b62b828562fc91c7be5380a992b2786a

ajrkmkrn
質問者

お礼

ご回答ありがとうございます。 私は素人なので少々分からないところもあるのですが、 とりあえず試してみます。

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

関連するQ&A

  • PHPとObjective-Cでハッシュが違う結果

    Objective-Cでハッシュ値を生成し、PHPに送って、 PHP側でもハッシュ値を生成し、この2つを比較したいと思っています。 PHPでは、以下の関数でSHA256が取得できることがわかりました。 hash_hmac('sha256', $text, false) Objective-Cは自分で実装する必要があるようなので、以下のページのコードを使わせてもらいました。 http://zak-za-k.blogspot.jp/2011/09/objective-csha256.html この2つの関数それぞれで、同じ文字列を使ってSHA256のハッシュ値を出したのですが、 結果が違ってしまいます。 2つの関数で同じ結果を得られるようにするにはどうすればよいでしょうか。 参考にした上記URLのコードの内容は、ほとんど理解できていません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • HMAC-SHA1ハッシュ関数について

    HMAC-SHA1ハッシュ関数について質問です。 HMAC-SHA1 によってダイジェスト値を生成し、BASE64 でエンコードすることによってシグニチャを生成したいと考えました。 参考サイト http://weboo-returns.com/blog/php-oauth-consumer-request-2-legged-oauth/ 上記の例では、 ●ダイジェスト値 GET&http%3A%2F%2Fapi.gu3.jp%2Fv1%2Ftest%2Fauth&oauth_consumer_key%3Dyamashita.dyndns.org%26oauth_nonce%3Dc83b1847200bd25d918c3fb077aca16f%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1219931263%26oauth_version%3D1.0 ●共有キー kd94hf93k423kf44& とした場合、ここから得られる、シグニチャは以下のようになりますと書かれています。 M32qYtcaUD8b1Kb/AponRG5hrwI= 上記を下記のPHPで試してみました。 ********************************************* <?php $key2 = 'kd94hf93k423kf44&'; $Base_String2 = 'GET&http%3A%2F%2Fapi.gu3.jp%2Fv1%2Ftest%2Fauth&oauth_consumer_key%3Dyamashita.dyndns.org%26oauth_nonce%3Dc83b1847200bd25d918c3fb077aca16f%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1219931263%26oauth_version%3D1.0'; $OAuthSignature2 = base64_encode(hash_hmac('sha1', $Base_String2, $key2, true)); echo $OAuthSignature2."\n"; ?> ************************************** ここから得られたシグニチャは以下のようになりました。 /j6JriS6FRFbKat4X3pJg4hO1Po= 残念ながら例示であるM32qYtcaUD8b1Kb/AponRG5hrwI=と一致しません。 私のPHPの書き方に誤りがあるようです。 質問 HMAC-SHA1 によってダイジェスト値を生成し、BASE64 でエンコードすることによってシグニチャを生成するPHPはどのように書けばよいのでしょうか?

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

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

  • 文字数の短いユニークなID生成

    以下のようにして文字数の短いユニークなID生成をしようとしていますが、Digest::SHA1を使って生成したものをsubstrで先頭から任意の文字数でカットしてしまったものは「ユニークなID」という資質を保っているのでしょうか? メール本文にURLを記載することを前提としているので、Digest::SHA1で生成した段階のものでは文字数が長過ぎてURLとして認識されないため、このように生成されたものをカットしています。 use Digest::SHA1 qw(sha1_hex); $yourid = substr(&genUniqID,0,15); sub genUniqID{ my $word = shift || 'anyone'; my $id = join('' , $ENV{'HTTP_USER_AGENT'} , time , rand(9999) , $word ); return(sha1_hex($id)); }

    • ベストアンサー
    • Perl
  • sha-1のプログラム

    任意の値を入力すると、その値をSHA-1でハッシュ化するプログラミングを探しています。 色々とサイトはあるのですがエラー等が出てしまいます。例えば http://free.pjc.co.jp/SHA1/index.htmlのサイトは自分が求めているプログラムなのでしょうか?? 変更箇所があったりする場合、私はお手上げなのです・・・。 cygwinを使っているのでそのコマンド(コンパイルの仕方)も教えていただきたいです。よろしくお願いします。 ちなみにC言語で行っています。

  • 一意(ユニーク)かつ、ソートに対してランダムな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程度を考えていますが、もっと大きなオーダーでも衝突しないに越したことはありません。

  • cmdで使えるSHA3ありますか?

    Windows8のコマンドプロンプトで動くSHA3計算ソフトありますか? 引数として与えた文字列のSHA3を取れて、そのままシンプルに出力してくれるのがベストです。 ファイルハッシュは取れなくてもいいです。 できればフリーソフトでお願いします。 よろしくお願いします。 理由:現状、電子情報におけるあらゆる名前付けにSHA256を使っている・・・使っていくつもりだが、 最近、英語版ウィキペディア辺りでもCollisionについて何やら記述されるようになってきた(http://en.wikipedia.org/wiki/Cryptographic_hash_function 下のほうの表にYesとある)ので、 個人的にしか使っていないとはいえ、他人に質問されると説明が面倒なのでSHA3に移行したい。 現状の使用例をYoutube動画に上げてみました。(http://www.youtube.com/watch?v=VN6DPuUeKfY) 参考まで。 実際には殆ど使っていません。ほぼ上の動画のケースだけです。 なので急ぎではないです。

  • ハッシュ化で元の文字列の方が長くても大丈夫ですか?

    例えば1000桁の文字列をphpのhash()でsha512を用いてハッシュ化した場合、重複の危険性は 無視出来る程度なのでしょうか。 ご存知のかた、お手数をおかけいたしますがご回答のほどよろしくお願い致します。

  • パスワードの決め方について(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 攻撃以外の危険性はありますか?

  • ハッシュ法でのデータ管理について教えてください

    ハッシュ法でのデータ管理をするプログラムを作りたいんですが長いことPASCALに触ってなかったせいか全く分かりません。 どなたか教えていただけないでしょうか??問題の概要は以下のようなものです。 表に登録するデータについては、キーは英数字からなる長さ8までの文字列でデータ本体は整数(型名はintegerでよい)です。 ハッシュ表のサイズは11とします。 ハッシュ関数は文字列xの各文字のASCIIコードの総和を11で割った余りとします。 さらにメニュー表示として入力した文字により行う操作を決定します。 どの文字がどのような操作を行うのかは以下のとおりです。 's' の場合: ハッシュ表に登録されている全レコードを,ハッシュ関数値毎に(キーの値とデータの両方を)すべて表示します. 'r' の場合: さらに「キーの値」と「データ」を入力し,すでに同じキーをもつデータがあれば「二重登録」として検出し,そうでなければ,そのレコードをハッシュ表に登録します. 'e' の場合: さらに「キーの値」を入力し,そのキーをもつデータがハッシュ表に登録されているならば, そのデータを表示します.さらに削除するかどうかを入力させて,削除する選択をした場合にはそのレ コードを削除します.そのキーをもつデータがハッシュ表にない場合には「そのキーをもつレコードが ないこと」を出力しますが,ハッシュ表には操作を加えません. 'i' の場合: ハッシュ表に登録されている全レコードを,キーの値が小さい順に表示します.ここで「キー の値の順」とは,文字列の辞書順のことを意味します.Pascal では,文字列a,b に対して,a がb より 辞書的順序が先(小さい) ときには「a<b」で表現できます. 'd' の場合: 「'i' の場合」の逆で,キーの値が大きい順に表示します. 'q' の場合: プログラムを終了します.具体的には,実行文部の最後の「end.」の直前までジャンプし ます. 長くなってすいません。ちょっとしたヒントでもいいので教えていただければ幸いです。