• 締切済み

セキュリティ証明書のハッシュ値について

セキュリティ証明書(SSL通信時などに利用する証明書)には 拇印情報があり、ここは証明書自身のハッシュ値が記録されていると聞きました。 証明書から作成されたハッシュ値を再びハッシュ値に記載したら 元の証明書を書き換えているため、次回ハッシュ値を求めたら別のハッシュ値になりませんか? 1.証明書 -> [ハッシュ関数] -> ハッシュ値 2.ハッシュ値を証明書に記述記載 3.証明書(ハッシュ値付き)-> [ハッシュ関数] -> ハッシュ値 1と3の結果のハッシュ値同士は一致しないですよね? GMailの証明書を見ると、sha1で、 90adbe01984695b6649ad0f9ef4f1b5836eb380d という値になっていて、 私の端末(WindowsXP)でfcivコマンドを実行した結果も fciv -sha1 gmail.cer 90adbe01984695b6649ad0f9ef4f1b5836eb380d gmail.cer となり、同じ値なのですが。。。 証明書に記載されているハッシュ値はどのように計算されているのでしょうか?

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

>2で更新された証明書ファイル自身のハッシュ値が一致する理由が分からない 質問者は質問を発したときからずっと,3番目の計算方法を次のようだと思いこんでいらっしゃるからじゃないですか。 ---------------------------------------- 3.証明書(ハッシュ値付き)-> [ハッシュ関数] -> ハッシュ値   (No.2の私の回答の言葉に置き換えれば) 3.証明書の基本フィールド+プロパティ -> [ハッシュ関数] -> ハッシュ値 ---------------------------------------- それに対して私は,そうじゃない,ハッシュ値は「証明書ファイル自身」の中になんて格納されていない,と繰りかえし回答しているわけです。

zipakja
質問者

補足

すいません、海外転勤になりまして、返事が書けませんでした。申し訳ございません。 私、”証明書”自身を間違っていたかと思います。 InternetExplorerで閲覧中のページで右クリック。 プロパティ(P)で プロパティを表示 証明書(C)をクリックし、証明書を表示。 http://imagepot.net/view/124954749971.jpg この際に表示されるものを証明書だと思っていました。 (この証明書Windowの詳細タブに捺印とあるので、証明証にハッシュ値が記載されているのだと思っていました) 上記オペレーションで表示されるのは証明書ではなく、 証明書を閲覧するアプリケーションで、 拇印欄はその証明書を閲覧するアプリケーションがハッシュ値を算出している。 と認識しても間違いありませんでしょうか?

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

>証明書に記載されているハッシュ値の計算方法が見当たりませんでした。 質問者ご自身が fciv -sha1 を実行なさっていましたから,ハッシュ値の計算方法がsha1だというのは自明だと思っていました。 http://ja.wikipedia.org/wiki/SHA http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab18/lab18.html >なぜ、証明書自身のハッシュ値と一致するのかも記述がありませんでした。 gmail.cerファイルに格納されているのが「署名前証明書」「バージョン1のフィールドのみ」の情報だということです。その情報は Windowsの証明書ストアにimportされてもそのままですから,まったく同じデータから生成されたsha1の結果はまったく同じになります。 1.証明書の基本フィールド -> [ハッシュ関数] -> ハッシュ値 2.ハッシュ値を証明書のプロパティ(基本フィールドではない)に記述記載 3.証明書の基本フィールド(ハッシュ値なし)-> [ハッシュ関数] -> ハッシュ値 1と3の結果のハッシュ値同士は一致しますよね?

zipakja
質問者

補足

> 1.証明書の基本フィールド -> [ハッシュ関数] -> ハッシュ値 > 2.ハッシュ値を証明書のプロパティ(基本フィールドではない)に記述記載 > 3.証明書の基本フィールド(ハッシュ値なし)-> [ハッシュ関数] -> ハッシュ値 > 1と3の結果のハッシュ値同士は一致しますよね? はい。 ハッシュ値が”証明書の基本フィールド”のみだと理解できました。 しかし、1の結果と、2で更新された証明書ファイル自身のハッシュ値が一致する理由が分からないのです。。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

次のページに図解されている「署名前証明書」を入力データとしてハッシュを求めているからではないですか。 http://www.ipa.go.jp/security/pki/033.html 私はいまIE7を使っているのですが, [詳細]タブの[表示]領域を「プロパティのみ」にしたときは次の4つのフィールドが表示されますが,  ・拇印アルゴリズム  ・拇印  ・フレンドリ名  ・拡張キー使用法(プロパティ) 「バージョン1のフィールドのみ」にしたときは上記の4フィールドは表示されません。 http://keiyaku.city.yokohama.lg.jp/epco/sinsei/img/CA-Setup03-2.jpg ハッシュは,証明書の属性(プロパティ)としての位置づけだということでしょう。

zipakja
質問者

補足

ご丁寧な説明と回答ありがとうございます。 教えていただいたページを参照したのですが、 証明書に記載されているハッシュ値の計算方法が見当たりませんでした。 それと、なぜ、証明書自身のハッシュ値と一致するのかも記述がありませんでした。 未だに証明書のImport結果のハッシュ値と証明書に記載されているハッシュ値が一致する理由が理解できません。。。

関連するQ&A

  • ハッシュ値 のファイル

    あるファイルfile1.txt のハッシュ値を計算してその結果を記載したファイル file2.txt のデータは、 Hash SHA1 hashsize=20 C1 14 ...... 4F のように、 先頭に、方式 1行あけて、サイズ 次の行に、計算したハッシュ値 となっているのでしょうか? 参考になる資料がありましたらよろしくお願いします。 なお、上の値は、 RFC6234 にある、ソフトを動かした結果です。 よろしくお願いします。

  • ハッシュのハッシュのソート

    rubyでハッシュのソート方法についてはいくつか情報のサイトを見つけられました。 ですが今やりたいのは、ハッシュのハッシュのソートなのですが、うまいやり方がわかりませんでした。 具体的には、 h1 = {"user1"=>{"a"=>10, "b"=>20, "c"=>30"}, "user2"=>{"d"=>5, "e"=>8}, "user3"=>{"f"=>10, "g"=>5, "h"=>10} } というようなハッシュのハッシュを想定しています。ユーザごとに案件ごとの必要工数(時間)をハッシュとして持たせ、全工数が多いユーザ順にソートしたいのです。 上記の場合だと、 {"user1"=>{"a"=>10, "b"=>20, "c"=>30"}, "user3"=>{"f"=>10, "g"=>5, "h"=>10}, "user2"=>{"d"=>5, "e"=>8} } というようにソートしたいのですが、何かやり方がありましたらご教授いただけますでしょうか。

    • ベストアンサー
    • Ruby
  • ハッシュを使った擬似乱数

    予測不能な擬似乱数列を生成する際に、よく一方向ハッシュの性質を利用する 場合があります。一方向ハッシュの生成源として内部状態が与えられますが、 内部状態のbitサイズはどの程度にしたらよいでしょうか?   [種(カウンタの初期値)]        |        |        ↓ ┌→[内部状態(カウンタ)]―┬―→(一方向ハッシュ)――→擬似乱数列 |                 | |                 ↓ |               [1増加] |                 | └―――――――――――┘ ※ 暗号技術入門 秘密の国のアリス 結城 浩 著      ――第12章 乱数 Fig.12.5 より 極端な例として鍵(種)のサイズを32bit(C言語でunsigned long型)、値を0とします。 |0000 0000|0000 0000|0000 0000|0000 0000| 上記の値でハッシュ値を取ります。ハッシュアルゴリズムがSHA1の場合、 以下のような値が得られます(と思います)。 a = -1099956234 b = -343932961 c = -1287651379 d = -84150665 e = -1099170433 これらの値から鍵の値を得ることは困難なので、ハッシュ値によって生成された 擬似乱数は予測不能であるといえます。また、鍵の値を1だけ加算させて次の擬似乱数 を生成します。一般的にこのようにして乱数列は生成されます。 上記の例では32bitのとり得る値は0~4294967295です。鍵の値を一つずつ試し ていけば、それほど時間をかけることなく乱数の予測不能性は破られてしまいます。 ここで鍵の値を256bitとしました。 |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| しかしこれだと1加算しただけではビット全体に対して変化が少なすぎます。 |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0000| |0000 0000|0000 0000|0000 0000|0000 0001|← 2005年に中国の大学の研究チームによってSHA1の弱衝突耐性が破られてしまいました。 現段階ではSHA1に変わる新しいアルゴリズムは発見されていません。(SHA2が作られましたが、 これはSHA1のbit数を拡張しただけで基本設計は変わっていません)なのでハッシュ値を 生成させる値もなるべく変化に富んだ値を与えることが推奨されています。 まとめると、   ・鍵(種)を総当り攻撃されないようにbit数を大きくしなけらばならない。   ・bit数を大きくすると1加算したときに変化が小さすぎる。   ・最初の図の手法は同記の文献に書いてあったもので、なるべく変えたくない。    (実際に使われる手法はある程度保障されているから) の制約があります。なので”bit数をどの程度にしたら適当か???”というのが質問です。 また、これらの問題を打開する方法もあればよいのですが、、、

  • 証明

    AD//BCである台形ABCDにおいて、対角線ACとBDの交点Pとする。また、点Pを通り、辺BCに平行な直線lを引き、辺AB、CDとの交点をそれぞれE,Fとする。 このとき、(1/AD)+(1/BC)=(2/EF)を証明する問題で。        A-----------D / \     /         \ /           \      /           \     B-------------------------C どのように考えるか分からないのでこの書き込みは消されてしまうかもしれませんが、よろしくお願いします。 この問題をまず解くには ・AE:EB=AD:BC ・DF:FC=AD:BC を考えるそうですがこの比の作り方(考え方がよくわかりません。) まとめると、 Pはこの図の中心点。 点Pを通るよく線はl ABとDCで交わった直線lをE,Fと置く。

  • 暗号学的ハッシュ関数でbit長が適切って作れますか

    SHA256が(224かもですが)最小bit長で、 入力に1bitでも、また2bit以上入力値全体まで、異なれば、 出力のうちほぼ半数のbitが反転する、かつその 反転するbit位置は複数の入力値に対して法則性はなく、 ほぼランダムである。 という暗号学的ハッシュ関数であるのは、正しいですか? また、データの暗号化に使われるパスワードは4096bitを推奨との 事ですが、 SHA4096などその時に合った暗号学的ハッシュ関数を 作るのは難しいのですか? 素人考えでは、今256bitで衝突が見つかってないなら 4096bitならbit長大きいのだから作れそうな気もしますが やはりそういう問題ではないのでしょうか? もし作れるとしたら、データの暗号化に使うパスワードを SHAなんとか・・・の出力そのまま使っては、危険でしょうか? というかデータに限らず認証のパスワードでも SHAなんとかの出力そのままを使うのは何かまずいのでしょうか? もしできたらパスワードを覚えなくてよいのでいいかと思ったのですが。 パスワードは「IDのパスワード」をSHAなんとかに通した値ということで。 IDは「種パスワード+なんとかのサイト」をSHAなんとかに通した値ということで。 種パスワードはしょうがないからネットをパスワードの決め方とかで検索して 出てきた方法を見て理解して自分なりにアレンジして、最後にちゃんと頭に記憶して。 とりあえずここまで、どうでしょうか。

  • ハッシュ

    この問題の解き方を出来ればわかりやすくお願いします。 疑問:データと書いてある所に16進数の解答の答えを10進数に直していれるのでしょうか? 問題↓ 表A ーーーーーーーーーーーーーーーーー データと格納順 7B→B5→A7→58→FE→6A→7D→E9→88 ーーーーーーーーーーーーーーーーー ハッシュ値を f(データ)=mod(データ,8) で求めたとき最初に衝突が起こる。(上の表Aにあるデータと等しいハッシュ値になる)のはどのデータか。mod(a,b)はaをbで割った余りを表す。 a 6A b E9 c 7D d 88 (問題の解答はもとめておりません)

  • サーバ証明書等の正当性の確認について。

    サーバ証明書、証明書には、 認証局の署名をSHA-1等のハッシュ関数で、 ハッシュ化されたハッシュ値を、 認証局の秘密鍵で暗号化された認証局の電子署名が付加されていると思いますが、 その部分の信頼性についてですが、 認証局から、 公開鍵を取り寄せて、 ハッシュ値を取り出すと思うのですが、 もともとの平文(署名)を認証局から取り寄せることは可能でしょうか。 認証局の公開鍵で復号できたから、 認証局の秘密鍵で暗号化されているといえるのですが、 もともとの署名が何かがわかりません。 (ちょっと信頼性にかけるような気がします。) 署名を取り寄せることができれば、 署名をSHA-1等を使って、 ハッシュ値を取り出して、 公開鍵で復号したハッシュ値と比較することができます。 公開鍵と平文(署名)を取り寄せることはできないのでしょうか。

  • 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
  • Perlでハッシュや配列で重複するキーについて

    ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか? %a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4); また、配列の場合はabadと4つ数になるということでしょうか? @a = ('a','b','a','d'); この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。

    • ベストアンサー
    • Perl
  • ハッシュ法でのデータ管理について教えてください

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