![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
プログラミング・数学? 初心者です。
IDやパスワード管理によく出てくる一次方向(ハッシュ)関数ですが、
よくパスワードとSALTを一緒にしてハッシュ関数を通してハッシュ値を取得しますよね。
そしてその結果(データベースなどに記録済み)とログイン時に入力した値とを照らし合わせるわけですが、
昔まだ若いころ、これとは別のタイプのハッシュ関数を使用したことがあります。
それはある(パスワードなどの)値をハッシュ関数で処理すると「いろんなハッシュ値」が生成され、
そのハッシュ値から当然パスワードは予測できないのですが、
しかしその複数のハッシュ値は全て、そのパスワードから生成されたハッシュ値だということは分かる、という関数を使用したことがあります。
その時はperlのcpanモジュール(名前を覚えていません。すいません。)を使ったのですが、この別のタイプのハッシュ関数はどういう仕組みで作られているのでしょうか?
SALTが複数あり、そのそれぞれについて照合している?だけでしょうか?
それとも私が無知で、そんな関数がそもそも存在するだけでしょうか?
わかりません。教えてください。
No.2ベストアンサー
- 回答日時:
crypt関数のようにパスワードの生成を目的とした関数でダイジェスト (質問者が言うところのハッシュ値) を作る場合、普通ダイジェストにはSALTの値が含まれています。
例えば、Perl標準のcrypt関数は、SALTとしてダイジェストを渡すとそこからSALTを自動的に取り出して、与えられたパスワードと本のダイジェスト生成時に使ったSALTを使ったダイジェストを計算します。
http://perldoc.perl.org/functions/crypt.html
よって、Perlのcrypt関数を使ったパスワードの検証は次のようにすると上記マニュアルでも説明されています。
| crypt($plain, $digest) eq $digest
質問者が言うところのCPANのモジュールはこれをラップしたようなモジュールだと予想します。
つまり、ハッシュ値を計算する関数を呼ぶと乱数などから自動的にSALTを作成し、ハッシュ値を返す。正しいパスワードか検証する関数は、ダイジェストと一緒に渡すと勝手にSALTを取り出して計算して一致、不一致を教えてくれるという動きをするのでしょう。
実際にコードで書くとこんな感じでしょうか。 (SALTが短く選び方も雑ですが、分かりやすさを重視してそこら辺は手抜きしてます)
sub my_crypt {
my ($password) = @_;
my @salt_candidate_chars = ('a' .. 'z', 'A' .. 'Z', '0' .. '9');
my $salt = $salt_candidate_chars[int(rand($#salt_candidate_chars + 1))].
$salt_candidate_chars[int(rand($#salt_candidate_chars + 1))];
return crypt($password, $salt);
}
sub my_verify {
my ($password, $digest) = @_;
return crypt($password, $digest) eq $digest;
}
my $d = &my_crypt("password");
print "digest: $d\n";
print "wrong:" . &my_verify("wrong", $d) . "\n";
print "correct:" . &my_verify("password", $d) . "\n";
> その時はperlのcpanモジュール(名前を覚えていません。すいません。)を使ったのですが、この別のタイプのハッシュ関数はどういう仕組みで作られているのでしょうか?
ランダムにSALTを生成する上記のような仕組みだと思います。
> SALTが複数あり、そのそれぞれについて照合している?だけでしょうか?
SALTが複数あるというより、上記のようにランダムに作っていると予想します。
そして、SALTがハッシュ値 (というか、ダイジェスト) と一緒に出力されていると思います。
当然、検証の時はダイジェストも渡しますよね?
回答ありがとうございます。昔の事なので、今となっては曖昧な記憶しかありませんが、たぶんhanabutakoさんの言うとおりだと思います。ありがとうございます。
No.1
- 回答日時:
crypt関数のことだと思うので、詳しいことは参照URLの閲覧をお願いします。
ランダムに生成されたsaltキーに関しては、生成されたハッシュ文字列に含まれるので、
1.保存されているハッシュ文字列からsaltキーを抜き出す。
↓
2.入力されたパスワードとsaltキーを使って暗号化
↓
3.暗号化したものと保存されているハッシュ文字列が合っているかを検証
↓
4.認証
という手順です。
ちなみになぜsaltを使うのかというと、同じパスワードを設定していたとして一つがバレても、saltキーが違うおかげで生成されたハッシュ文字列が違うので、同じパスワードと気づかれないようにするのが大きな目的です。(他にもありますが。)
参考URL:http://www.sea-bird.org/doc/Solaris8/Perl_5.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) ハッシュ値を取ったらその取ったハッシュ値はどのように保管すればよいのでしょうか?ハッシュ値のデータす 2 2023/07/02 19:40
- その他(コンピューター・テクノロジー) なぜデータの整合性を確認する時はハッシュ値で確認するのでしょうか?ハッシュ値は衝突する可能性があるの 5 2023/07/05 20:38
- その他(コンピューター・テクノロジー) exFATの外付けSSDからパソコンのNTFSの内蔵ストレージにコピーした場合はコピーしたデータのハ 2 2023/08/09 19:51
- その他(コンピューター・テクノロジー) インターネットを使わずにハッシュ値を取ることは可能なのでしょうか? 1 2023/06/27 20:27
- その他(コンピューター・テクノロジー) ベリファイの機能がある製品やソフトが世の中には多くありますが、それらのベリファイは何でベリファイして 3 2023/06/28 19:49
- その他(セキュリティ) デジタル署名について 4 2022/08/12 14:54
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- その他(コンピューター・テクノロジー) この用途で快適に使うにはどのくらいのスペックのパソコンを買うべきなのでしょうか? ・100ギガのデー 4 2023/07/20 19:50
- その他(コンピューター・テクノロジー) 外付けHDDや外付けSSDのデータが壊れていないかをハッシュ値で確認する方法は確実ではないって本当で 3 2023/06/26 20:42
- その他(コンピューター・テクノロジー) パソコンは同時に作業をすることが出来るらしいですが以下の動作の全てを同時にすることも可能なのですか? 5 2023/07/22 11:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
チェックデジットについて
-
短いハッシュの作り方
-
英語でのシャープとコメの呼び...
-
C++ではハッシュはどのように書...
-
文字列を変数名として扱う方法
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
GIFアニメをループさせたくない
-
VBAのautofilter、criteriaの配...
-
VB2010でCSVファイルの読み込み
-
ListBox 複数選択 で オートフ...
-
Escキーを押すと、中断する時と...
-
範囲指定したセルを1つずつ飛...
-
Can't use string ("0") as an ...
-
perlで配列の要素が空なのを知...
-
VisualStudioにてモザイクの画...
-
多重ループの抜けだし方
-
乱数の桁数指定、または範囲指定。
-
VBのReturnの使い方
-
VBA for文が止まらない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
ハッシュのハッシュを実現したい。
-
まったく同じファイルのハッシ...
-
列挙型と連想配列の違いを教え...
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
短いハッシュの作り方
-
英語でのシャープとコメの呼び...
-
ハッシュマーク以降のアドレス取得
-
一意(ユニーク)かつ、ソート...
-
Perlは戻り値で、ハッシュや配...
-
ハッシュリストって単にハッシ...
-
ActivePerl がハングアップ
-
多次元配列から重複を削除
-
mapのポインタ
-
Perlのハッシュ変数のソートに...
-
Perlのサブルーチンの引数に配...
-
文字数の短いユニークなID生成
おすすめ情報