あなたの質問を明確に理解しているかどうかはわかりませんが、パスワードの強度とそれがブルートフォース攻撃にどのように影響するかに焦点を当てます.
それでもある程度の速度で動作し、辞書攻撃や脆弱なパスワードのブルート フォース攻撃には十分であり、[おそらく] 6 文字の英数字よりも短い.
序章
しばらくの間、ハッシュ アルゴリズム (md5、sha、pbkdf2 bcrypt、scrypt など) を忘れて、最初にパスワードの強度に注目しないようにします。
パスワード強度 ウィキ
これは、推測やブルート フォース攻撃に対するパスワードの有効性の尺度です。通常の形式では、パスワードに直接アクセスできない攻撃者がパスワードを正しく推測するために必要な平均試行回数を推定します。
次のように簡単に計算できます。

エントロピーは、 はパスワードの長さ、はアルファベットのサイズH=Llog2N
で与えられ、通常はビット単位で測定されます。L
N
ハッシュ関数
password_hash
パスワードには[bcrypt][4]
デフォルトで十分ですが、PBKDF2やscryptなどのより良い代替手段があり、意味の詳細については、パスワードを安全に保存する方法を参照してください
oclHashcatを使用して、以下を見積もりましょう
+--------+-----------+----------------+
| HASH | ESTIMATE | BITS/S |
+--------+-----------+----------------+
| MD5 | 10742M | 90110427136 |
| BCRYPT | 31M | 260046848 |
+--------+-----------+----------------+
これは推定値であり、ハードウェアの容量によって異なる場合があることに注意してください
この情報を使用して、別のパスワードをブルート フォースするのにかかる時間を安全に計算できます。
PHP でエントロピーを計算する
$passwords = array(
"1234",
"F2A1CC",
"password",
"PaSSworD",
"P4ssw0Rd97",
"p#aSS*Word14",
"Dance With Me Tonight"
);
print("PASSWORD\tLENGTH\tENTROPY\tTIME MD5\tTIME BCRYPT\n");
foreach($passwords as $password ){
printf("%s\t%s\t%s\t%s\t%s\n",
$password,
strlen($password),
$entropy = calculateEntropy($password),
totalTime($entropy, "90110427136"), // Check with MD5
totalTime($entropy, "260046848") // Check with BCrypt
);
}
出力
+-----------------------+--------+---------+------------+----------------+
| PASSWORD | LENGTH | ENTROPY | TIME MD5 | TIME BCRYPT |
+-----------------------+--------+---------+------------+----------------+
| 1234 | 4 | 13.29 | 1min | 1min |
| F2A1CC | 6 | 24.00 | 1min | 1min |
| password | 8 | 37.60 | 1min | 1min |
| PaSSworD | 8 | 45.60 | 1min | 1day+ |
| P4ssw0Rd97 | 10 | 59.54 | 2mo+ | 71yr+ |
| p#aSS*Word14 | 12 | 75.86 | 13,479yr+ | 4yr+ |
| Dance With Me Tonight | 21 | 120.29 | 474,250yr+ | 164,335,595yr+ |
+-----------------------+--------+---------+------------+----------------+
csv2table を使用して変換された出力
パスワード クラッカーの CUDA/OpenCL 実装は、GPU で利用可能な膨大な量の並列処理を活用でき、1 秒あたり数十億の候補パスワードでピークに達します。
921600M c/s
非常に高速なシステムで並行して行うことができる見積もりをしましょう
T = 966367641600 * 8
T = 7,730,941,132,800 // bits/sec
使用する
foreach($passwords as $password ){
printf("%s\t%s\t%s\t%s\n",
$password,
strlen($password),
$entropy = calculateEntropy($password),
totalTime($entropy, "7730941132800") // Check with Hash
);
}
出力
+-----------------------+---------+---------+----------+
| PASSWORD | LENGTH | ENTROPY | TIME |
+-----------------------+---------+---------+----------+
| 1234 | 4 | 13.29 | 1min |
| F2A1CC | 6 | 24.00 | 1min |
| password | 8 | 37.60 | 1min |
| PaSSworD | 8 | 45.60 | 1min |
| P4ssw0Rd97 | 10 | 59.54 | 20hr+ |
| p#aSS*Word14 | 12 | 75.86 | 157yr+ |
| Dance With Me Tonight | 21 | 120.29 | 5,527yr+ |
+-----------------------+---------+---------+----------+
ご覧のとおり、まともな 12 桁が壊れるにはまだしばらく時間がかかります。
使用する機能
// Calculate Password entropy
// Uses H = L Log2 N
// where L is the length of the password and
// N is the size of the alphabet, and it is usually measured in bits
function calculateEntropy($password) {
// See http://en.wikipedia.org/wiki/Password_strength
// Entropy per symbol for different symbol sets
// Missing All extended ASCII printable characters
// Missing Diceware word list
// TODO
// Larger Character Set
// '/[\!"#$%&\'\(\)\*\+,\-.\/:;<\=>\?\@\[\]^_`\{|\}~]+/' => 32,
$cases = array(
"/\s+/" => 1, // Arabic numerals (0–9) (e.g. PIN)
"/[0-9]+/" => 10, // Arabic numerals (0–9) (e.g. PIN)
"/[a-z]+/" => 26, // Case insensitive Latin alphabet (a-z)
"/[A-Z]+/" => 26, // Case insensitive Latin alphabet (A-Z)
'/[\!\@#$%\?\&\*\(\)_\-\+=~:;.]+/i' => 18 // Other Character
);
$L = strlen($password); // Length of password
$N = 0; // Character Set
foreach($cases as $regex => $value ){
if (preg_match($regex, $password)){
$N += $value;
}
}
// Don't confuse hexadecimal for alpha numeric characters
// hexadecimal numerals (0–9, A-F) (e.g. WEP keys)
if (ctype_xdigit($password)){
$N = 16;
}
// Fix pure number cases that might have been changed by hexadecimal
// Arabic numerals (0–9) (e.g. PIN)
if (ctype_digit($password)){
$N = 10;
}
// Using H = L Log2N
// See http://en.wikipedia.org/wiki/Password_strength
// Random passwords entropy
$H = $L * log($N, 2);
return number_format($H, 2);
}
// Claculate Total time it would take
// Using Entropy & froce / s
function totalTime($entropy, $force) {
bcscale(0);
// Total Base on entorpy 2^H
$total = bcpow(2, $entropy);
// Time Taken per sec on Force
$ss = bcdiv($total, $force);
$time = "";
$parts = [];
$parts['yr'] = bcdiv($ss, "31104000");
$parts['mo'] = bcdiv(bcmod($ss, 31104000), 2592000);
$parts['day'] = bcdiv(bcmod($ss, 2592000), 86400);
$parts['hr'] = bcdiv(bcmod($ss, 86400), 3600);
// Clean Year
// Can really generate large numbers
$suffix = "";
$yr = $parts['yr'];
if (!empty($yr)){
if (bccomp($yr, "1000000") > 0){
$parts['yr'] = bcdiv($yr, "1000000"); // Million
$year = " million ";
}
if (bccomp($yr, "1000000000") > 0){
$parts['yr'] = bcdiv($yr, "1000000000"); // Billion
$year = " billion ";
}
if (bccomp($yr, "1000000000000") > 0){
$parts['yr'] = bcdiv($yr, "1000000000000"); // Trillion
$year = " trillion ";
}
}
foreach($parts as $t => $v ){
if (empty($v)){
continue;
}
$time .= number_format($v, 0) . $suffix . $t . "+";
break;
}
return empty($time) ? "1min" : $time;
}
誤解
パスワードの長さはパスワードのエントロピーと同様に重要です。ほとんどの推奨事項は、パスワードの強度を理解せずにbcrypt、パスワードの複雑さなどを使用するようにユーザーにアドバイスしています
しかし実際には、最も単純なパスワードが最も強力なパスワードになることがよくあります。

ソース| 関連するブログ投稿
だから私は、それがどのように確かに遅いのか、特に、どのパスワード強度が安全に使用できると考えられているのかを知りたい.
ソース
絶対にありません6 letters
:)
- < 28 ビット = 非常に弱い。家族を締め出すかもしれない
- 28 ~ 35 ビット = 弱い。ほとんどの人を締め出す必要があり、多くの場合、デスクトップのログイン パスワードに適しています
- 36 ~ 59 ビット = 妥当。ネットワークおよび会社のパスワード用のかなり安全なパスワード
- 60 ~ 127 ビット = 強力。財務情報を保護するのに適しています
- 128+ ビット = 非常に強い。しばしばやり過ぎ
結論
ここにあなたが見るべきかもしれないいくつかの良い参考文献があります