libriciel / php-password
PHP库,用于计算密码的强度和熵,并生成随机密码。
3.0.1
2023-02-23 15:49 UTC
Requires
- php: ^8.1
- ext-json: *
- ext-mbstring: *
Requires (Dev)
- phpmd/phpmd: ^2.11
- phpunit/phpunit: ^9.5
- sebastian/phpcpd: ^6.0
- squizlabs/php_codesniffer: ^3.6
This package is not auto-updated.
Last update: 2024-09-19 23:12:50 UTC
README
PHP库,用于计算密码的强度和熵,并生成随机密码。
背景
我们想要防止未经授权的人在我们的应用程序中进行身份验证。
- 通过测试密码的暴力破解
- 或访问存储在数据库中的密码
需求
- 减缓在线尝试
- 减缓在数据库中查找密码
- 仅存储密码的哈希值在数据库中
- 使用安全盐,将安全字符串附加到密码之前再计算其哈希值
- 使用慢速哈希算法
- 对用户密码设置限制
- 密码强度(难度,熵):可能的组合数量
- 取决于长度
- 取决于可能的字符数量(数字,字母,大写字母,重音符号,特殊字符)
- 拒绝某些密码
- 那些被公开或广泛传播的
- 包含太多重复的
- 密码强度(难度,熵):可能的组合数量
库的使用
示例
密码强度(根据ANSSI)
use Libriciel\Utility\Password\PasswordStrengthMeterAnssi;
$pwdStrengthAnssi = new PasswordStrengthMeterAnssi();
// L'entropie, ici 61
$pwdStrengthAnssi->entropy('mot de passe');
// La force (entre 1, très faible et 5, très fort), ici 1
$pwdStrengthAnssi->strength('mot de passe');
随机密码生成
用例是创建一个随机密码,存储为哈希和盐的组合,用于通过密码重置邮件的链接(具有在URL中随机生成的另一个值)而无需写入密码。
默认情况下,生成的密码使用的是Latin-1中最常用的62个数字和字母:0到9,a到z和A到Z。
默认生成长度为40的密码,对应于熵为238的5级强度。
我们永远不能确定是否具有配置的每个字符类中的字符!
在最坏的情况下,如果生成了0000000000000000000000000000000000000000
,则强度为1,熵为40。
use Libriciel\Utility\Password\PasswordGeneratorAnssi;
// Configuration complète par défaut
$config = [
'binary' => false,
// de 0 à 9
'numbers' => true,
'lowercase_hexadecimal' => false,
'uppercase_hexadecimal' => false,
// de a à z
'lowercase_letters' => true,
// A à Z
'uppercase_letters' => true,
'symbols_1' => false,
'symbols_2' => false,
'lowercase_accents_fr' => false,
'uppercase_accents_fr' => false
];
$pwdGeneratorAnssi = new PasswordGeneratorAnssi();
// Exemple de sortie: MUAVGHF4O5VPDboTwSJebjwNcryqYmRSS2izJHyJ
$pwdGeneratorAnssi->generate();
密码示例
0或1(二进制)的2个符号
- 非常弱,0 <= 熵 < 64,少于64个字符:
00111
- 弱,64 <= 熵 < 80,64到79个字符:
1001011011110111000001110111000001111000000100111000101110011110
- 中等,80 <= 熵 < 100,80到99个字符:
11110001011001110010111100111100011001100001101001100100111110011011111100001000
- 强,100 <= 熵 < 128,100到127个字符:
0100010111111110101100011111100110110111011000111100110100100011110101111101001010000111100101111010
- 非常强,128 <= 熵,多于127个字符:
00110010011111110111011000101111011111100110000010100110000011001001110110110011011011110100110111100010000101001010101010001110
0到9的10个符号(十进制)
- 非常低,0 <= 熵 < 64,少于20个字符:
54612
- 低,64 <= 熵 < 80,20到24个字符:
96442571499252715213
- 中等,80 <= 熵 < 100,25到30个字符:
5478444456254874224762975
- 高,100 <= 熵 < 128,31到38个字符:
7241455799436811802114240877052
- 非常高,128 <= 熵,超过38个字符:
375112021368327243201601633713856751474
16个符号0到9和A到F(十六进制编码)
- 非常低,0 <= 熵 < 64,少于16个字符:
870E0
- 低,64 <= 熵 < 80,16到19个字符:
6A183F3AE2B00906
- 中等,80 <= 熵 < 100,20到24个字符:
65C88BAED3D6ECC0B705
- 高,100 <= 熵 < 128,25到31个字符:
61ABB6F019F76328F0D62C267
- 非常高,128 <= 熵,超过31个字符:
D9DA43DA38F70012416EF268A86A7E8B
26个A到Z的符号(字母编码)
- 非常低,0 <= 熵 < 64,少于14个字符:
JQMVC
- 低,64 <= 熵 < 80,14到17个字符:
BLMQNYZLABYOIC
- 中等,80 <= 熵 < 100,18到21个字符:
PHUAZZNJLOIYFHPHCA
- 高,100 <= 熵 < 128,22到27个字符:
KSFUNDDVTJWHHPKGXUNZJB
- 非常高,128 <= 熵,超过27个字符:
YFJRELLOVUQQUOUAGWLIHXXQIWKU
36个符号0到9和A到Z(字母数字编码)
- 非常低,0 <= 熵 < 64,少于13个字符:
1UGQN
- 低,64 <= 熵 < 80,13到15个字符:
Z7L14FUEP48KK
- 中等,80 <= 熵 < 100,16到19个字符:
OOF5WYZW1PDGRNQW
- 高,100 <= 熵 < 128,20到24个字符:
Q6H3E9SUPB5N4Q830KCM
- 非常高,128 <= 熵,超过24个字符:
8HSTJHN4X13EEF87A457QZ6FK
52个A到Z和a到z的符号
- 非常低,0 <= 熵 < 64,少于12个字符:
lrPju
- 低,64 <= 熵 < 80,12到14个字符:
WSRuLKnVgzik
- 中等,80 <= 熵 < 100,15到17个字符:
IOxQLzDMvtkGGJq
- 高,100 <= 熵 < 128,18到22个字符:
FKCaVbPwSMEjaETgqG
- 非常高,128 <= 熵,超过22个字符:
edYwUOyseOFvMckpBAWcpqs
62个符号0到9,A到Z和a到z
- 非常低,0 <= 熵 < 64,少于11个字符:
YqSp4
- 低,64 <= 熵 < 80,11到13个字符:
8Z8pwoUtXAJ
- 中等,80 <= 熵 < 100,14到16个字符:
V4d1zH3em5BVMn
- 高,100 <= 熵 < 128,17到21个字符:
d3qe2nfe8S417Kd35
- 非常高,128 <= 熵,超过21个字符:
4rVeh6NoPV3X0DzvhFs9tL
70个符号0到9,A到Z,a到z和!#$*% ?
- 非常低,0 <= 熵 < 64,少于11个字符:
8P$uw
- 低,64 <= 熵 < 80,11到13个字符:
6jmw8fYf%M8
- 中等,80 <= 熵 < 100,14到16个字符:
8€rSvNuXCk1YTj
- 高,100 <= 熵 < 128,17到20个字符:
%?a3M!UT?XMQBNqfx
- 非常高,128 <= 熵,超过20个字符:
zLpQrNdC!qj!mRdjtPW€54612
90个符号9,A到Z,a到z和!#$*% ?&[|]@^µ§ :/;.,<>°²³
- 非常低,0 <= 熵 < 64,少于10个字符:
tJ?Ve?9&²g
- 低,64 <= 熵 < 80,10到12个字符:
%46°QxY§#v
- 中等,80 <= 熵 < 100,13到15个字符:
a1t^Ywpj5 ;€o
- 强,100 <= 熵 < 128,16到19个字符:
V&j8oTQ&Ah§AµK4#
- 非常强,128 <= 熵,超过19个字符:
KW6 F§9b/x²O&A*Fv€er[
文档
- 计算机文件
- 检查密码安全性
- 常见密码列表
- xkcd
- https://www.kaspersky.com/blog/password-check/
- zxcvbn
- https://www.theguardian.com/technology/2016/aug/19/password-strength-meters-security
- https://blogs.dropbox.com/tech/2012/04/zxcvbn-realistic-password-strength-estimation/
- https://fr.wiktionary.org/wiki/Wiktionnaire:Listes_de_fréquence#Français
- https://github.com/bjeavons/zxcvbn-php
- https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler
- @todo
- https://security.stackexchange.com/questions/118450/is-there-a-threshold-for-a-password-so-long-it-doesnt-get-any-more-secure-or-ev
- https://nakedsecurity.sophos.com/2016/08/18/nists-new-password-rules-what-you-need-to-know/
- https://auth0.com/blog/dont-pass-on-the-new-nist-password-guidelines/
- 限制,值,...
链接
- https://www.cnil.fr/fr/authentification-par-mot-de-passe-les-mesures-de-securite-elementaires
- https://www.cnil.fr/fr/generer-un-mot-de-passe-solide
- https://en.wikipedia.org/wiki/Password_strength#Entropy_as_a_measure_of_password_strength
- https://www.ssi.gouv.fr/guide/mot-de-passe/
- https://www.ssi.gouv.fr/uploads/IMG/pdf/NP_MDP_NoteTech.pdf
- https://www.ssi.gouv.fr/administration/precautions-elementaires/calculer-la-force-dun-mot-de-passe/
- http://rumkin.com/tools/password/passchk.php
- https://www.e-services.uha.fr/mdp/
- https://madiba.encs.concordia.ca/~x_decarn/papers/password-meters-ndss2014.pdf
开发
构建一个完全准备好的Docker环境
docker-compose build
docker-compose run app bash