質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

604閲覧

BCryptやMessageDigestを使ってのランダムな値の作成

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/07/06 08:55

業務で使用しているソースを見ていて、
自分でも調べて処理の内容を記載したのですが少しわからないので
ご教授をお願いいたします。

java

1// ①:ランダムな値を取得? 2String hash = BCrypt.gensalt(); 3 4// ②:MessageDigestインスタンスを取得 5MessageDigest md = MessageDigest.getInstance("SHA-256"); 6 7// ③:①で取得したbyte型に変換して、メッセージダイジェスト(ハッシュ値)を更新? 8md.update(hash.getBytes()); 9 10// ④:ハッシュ値を計算して、byte配列を返す 11byte[] digest = md.digest(); 12// ⑤:格納用のStringBuilderを生成 13StringBuilder str = new StringBuilder(); 14// ⑥:byteの配列を16進数に変換して格納ループ 15for (byte b : digest) { 16 String hex = String.format("%02x", b); 17 str.append(hex); 18 }

上記のソースなのですが、
ユニークでランダムな値を作成するのに使用しているメソッドとの事なのですが、
特に1~3の部分の処理がいまいちわからないです。

1については調べてみてもよくわからず、
ランダムな値を返してるのかな?といったレベルの認識です。
2でハッシュ値を作成して、3でさらに1で取得した値を付け加えて
ハッシュ値を更新しているという認識でいいのでしょうか?

そしてこれは100%ユニークな値になるのでしょうか?
ご教授よろしくお願いいたします。

またここの説明間違ってるよって部分があったら、
指摘をお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ハッシュ関数とともに利用するSALT値の目的は、ハッシュ化するデータ(文字列)に "特定のルールで出力したSALTをつけてから" ハッシュ関数を通すことで、元の文字列を特定できにくくするためのものです。

ですので闇雲にランダムな値を出力だとハッシュ化した後に照合できなくなります。

ハッシュ化対象の文字列を target 、SALT値を salt とすると、行コメントされたところでの処理は…

  1. 普通は、target+salt を生成します。(引数に何も指定していないのは不思議ですが…。何らかの別のルールと値で照合しているなら引数なしもありえます)
  2. ハッシュ関数にSHA-256を採用する。
  3. 1の文字列( target+salt )をSHA-256でハッシュ化する

あとで照合をするときは、実行プログラム側がsaltを生成するルールを知っているので、チェック対象の文字列を check とすれば、check+slatで同じようにハッシュ関数にかけると、同じハッシュ値になります。

JavaでBCryptを扱っているフレームワークはSpringSecurityがあります。こちらはSALT生成→ハッシュ関数の実行→ハッシュ化した値が返される一連の流れを一発で実現しています。

なお、ハッシュ関数が衝突する確率はほぼ0ですが、文字列が短い場合や試行回数が多くなればなるほど衝突可能性は高まります。

投稿2017/07/08 16:44

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/12 01:39 編集

ご回答ありがとうございます、お返事遅れまして申し訳ございません。 詳しい説明ありがとうございます! 普通ならBCrypt.gensalt("引数");みたいな使用の仕方で 引数(target)+salt値という風になるということになるんですね。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問