この影文字列を考えてみましょう。
$y$j9T$PaFEMV0mbpeadmHDv0Lp31$G/LliR3MqgdjEBcFC1E.s/3vlRofsZ0Wn5JyZHXAol5
4つの部品があります。
- ID:y(yescrypt)
- パラメータ:j9T
- 塩: PaFEMV0mbpeadmHDv0Lp31
- ハッシュ: G/LliR3MqgdjEBcFC1E.s/3vlRofsZ0Wn5JyZHXAol5
尋ねる:
j9T
paramフィールドの意味は何ですか?- この領域には他のオプションがありますか?
- 公式文書はどこにありますか?
私はこの問題を見たことがあります。暗号化されたパスワードの形式は次のとおりです。/etc/shadow
しかし、そこには説明はありません。
ベストアンサー1
婦人声明
以下は、暗号化と関連概念の専門的な理解なしに、私が見つけたものとそれを解釈する方法です。
兆候
次のように注目する価値があります。yescrypt
CHANGES
文書OpenWall GitHubに関する情報0.8.1(2015/10/25)と1.0.0(2018/03/09)の間の変更点、yescrypt
サインが2つあります。:
$7$
-scrypt
非常にコンパクトでないクラシックハッシュ固定長エンコーディング$y$
- ネイティブyescrypt
とクラシックscrypt
ハッシュ、新しいハッシュは非常にコンパクトです。可変長エンコーディング
これはとてもコンパクトです可変長エンコーディング第2段落の終わりに複雑さのすべてではありませんが、ほとんどを紹介するものは何ですか?このUNIX StackExchangeの答え言う。
パラメータ
パラメータの簡単な説明を見るにはBitcoinWiki Yescrypt パラメータいくつかは役に立つかもしれません:
範囲 | 説明する |
---|---|
password |
パスワードハッシュ |
salt |
塩を使う |
flags |
トグル機能フラグ |
N |
Nを増やすと、ランタイムとメモリ使用量が増えます。 |
r |
Rを増やすと、アルゴリズムが動作するブロックのサイズが増えます(したがってメモリ使用量が増えます)。 |
p |
平行係数 |
t |
Tを増やすと、メモリ使用量を増やすことなくランタイムが増えます。 |
g |
元のパスワードを知らなくても保存されたパスワードハッシュを強化するために使用されるハッシュ「アップグレード」の数 |
NROM |
キーが依存する結果ROM |
DKLen |
エクスポートしたキーの長さ(出力) |
滞在
$7$
ハッシュが以下を使用する場合:
N
- 1バイト(文字)でエンコードr
- 5バイト(文字)でエンコードされます。p
- 5バイト(文字)でエンコードされます。
$7$
意味もあるから固定長エンコーディング、各パラメータにはエンコードするバイト数が事前に指定されており、各パラメータの順序は次のとおりです。$7$Nrrrrrppppp$
....$
[]
各バイトを角かっこで囲みます。$7$[N][r1][r2][r3][r4][r5][p1][p2][p3][p4][p5]$
... $
。また、これは、必要なバイトの正確な数が11であることを意味します。コンパクトではない)指定された順序のパラメータについて。
一方、ハッシュ値には$y$
3つのパラメータが必要です。
flags
- エンコードには少なくとも1バイト(文字)以上を使用してください。N
- エンコードには少なくとも1バイト(文字)以上を使用してください。r
- エンコードには少なくとも1バイト(文字)以上を使用してください。
それでも、$y$
ハッシュはすべてのパラメータでエンコードして使用できます。可変長。実際、これは各パラメータの前に固有のサイズが付いていることを意味します。#最初のバイトにエンコードして続行#バイト:
$y$[flags_len=#][flags1]
.........[flags#][N_len=#][N1]
[N#][r_len=#][r1]
$
$
状況をより複雑にするために、必須パラメータの後にオプションのパラメータが続きます。have
範囲。の価値have
によるとはいパスワード決めるもしあれば、p
およびt
また提供されたデータの一部g
です。NROM
パラメータに関する包括的なガイドと、どのような状況でどのパラメータを使用する必要があるかを知るには、以下を参照するのが最善です。yescrypt
PARAMETERS
文書OpenWall GitHubから。
コーディング
パラメータフィールドの復号化は次のように行われます。decode64_uint32()
、これ大量に、索引渡すatoi64()
.
現在のバイトのASCII値とデフォルトのピリオド文字(46)の違い:
atoi64_partial[77] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
64, 64, 64, 64, 64, 64, 64,
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
64, 64, 64, 64, 64, 64,
38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63
};
各フィールドの最初のフィールドバイトから始めて、yescrypt
次のようにします。
- 最初のフィールドバイトの使用インデックス配列上記のように。
- 取得配列項目を計算します。フィールドの部分値。
- 取得配列項目を計算します。後続バイト数フィールド値の残りの部分をエンコードします。
- それぞれ次のバイト、アルゴリズムはそれを使用します配列を再インデックスします。そしてデータを追加最終フィールド値に達します。
他のプロセスのためのいくつかの擬似コードがあります。BitcoinWiki Yescryptの機能部分。
デモパラメータエンコーディング
PARAMETERS
上記のファイルの例を見てみましょう。
flags = YESCRYPT_DEFAULTS
N = 4096
r = 32
p = 1
t = 0
g = 0
NROM = 0
上記の値のセットは標準として記述されます。大きくて遅い(メモリ使用量16MiB、bcryptパフォーマンスコストなど2^8 - 10-30ms待ち時間、16コアサーバーで1秒あたりのスループット1000+)選ぶユーザー認証のためのパスワードハッシュ、ROMなし。
$y$
署名です。
flags = YESCRYPT_DEFAULT = 182 = 0xB6 = j
存在するyescrypt
可変長エンコーディング。
ここでは、次のように定義されたものと同じようflags
にデコードする必要があります。YESCRYPT_DEFAULT
YESCRYPT_RW_DEFAULTS
(YESCRYPT_RW | YESCRYPT_ROUNDS_6 | YESCRYPT_GATHER_4 | YESCRYPT_SIMPLE_2 | YESCRYPT_SBOX_12K)
YESCRYPT_RW = 0x002
YESCRYPT_ROUNDS_6 = 0x004
YESCRYPT_GATHER_4 = 0x010
YESCRYPT_SIMPLE_2 = 0x020
YESCRYPT_SBOX_12K = 0x080
実装する論理的OR
yescrypt
最後の数字を導き出し、エンコードすることを行います。
N = 4096 = 0x1000 = 9
存在するyescrypt
可変長エンコーディング。実際、N = 2 decoding_N_fields。
r = 32 = 0x20 = T
存在するyescrypt
可変長エンコーディング。
$
これはyescript
、オプションのパラメーターが指定されていないことを示します。
ついに、塩追加されました。理論的には長さに制限はありません。しかし、塩の長さは4の累乗でなければなりません。。
$y$j9T$SALT$
はい
上記の説明を完了した後、視覚的に役立つ可能性がある有効で安全な例は次のとおりです。
$7$9/..../..../$SALTS$
$y$./.$SALT$
$y$8/.$SALT$