一、强密码的规则
长度要求:密码至少应为8-12个字符,最好超过14个字符。
字符复杂性:密码应包含大写字母、小写字母、数字和特殊字符(如!@#$%^&*)。
避免常见词汇:避免使用常见单词、用户名、生日等易于猜测的信息。
定期更改:建议定期更改密码(如每90天),避免长期使用同一密码。
不重复使用:不同系统和服务应使用不同的密码,防止一次泄露影响多个账户。
使用密码短语:用一系列无关的单词组成密码短语,可以增强密码强度和记忆性。
避免连续字符:避免使用连续的字符或数字(如123456, abcdef)。
多因素认证(MFA):结合使用密码和其他认证方式(如短信验证码、指纹、硬件令牌等)。
行业案例
1. NIST (National Institute of Standards and Technology)
NIST在其《数字身份指南》(NIST Special Publication 800-63B)中对密码强度提出了建议:
最低密码长度为8个字符。
不强制要求复杂性(如特殊字符)但推荐使用长密码短语。
禁用常见弱密码和曾经泄露的密码。
2. OWASP (Open Web Application Security Project)
OWASP建议:
密码长度至少为10个字符(企业内部系统)和16个字符(外部系统)。
强制使用多因素认证(MFA)。
使用密码管理器生成和存储复杂密码。
3. PCI-DSS (Payment Card Industry Data Security Standard)
PCI-DSS对密码有严格要求:
密码长度至少为7个字符。
包含字母和数字组合。
每90天强制更换密码。
禁用重复使用最近4次的密码。
二、基于现有生日、姓名、电话号码等信息生成字典用于弱口令自动化扫描
我们的目标是生成用户信息可能密码字典库
示例如下:
1. 文言一心
Q:已知用户 用户名“熊安一”,“王敏”,请帮助生成 可能的 密码字符串列表,包含拼音的可能性
A:
当为用户生成密码时,通常会考虑易于记忆但又不易被猜测的组合。以下是根据用户名“熊安一”和“王敏”生成的可能的密码字符串列表,这些列表包含了用户名拼音的可能性:
用户名:熊安一
xionganyi123:直接使用拼音并加上数字后缀。
XiongA1y!:使用首字母大写,加入数字和特殊字符。
y1anXiong:颠倒部分拼音字母的顺序。
Xiong1anY:使用拼音并改变数字的位置。
Xiong888A1:使用重复数字和拼音的组合。
Y1xiongAn:将用户名中的“一”置于开头。
An1Y_Xiong:使用下划线和拼音的组合。
1XiongA_nY:数字、下划线和拼音的混合。
用户名:王敏
wangmin666:直接使用拼音并加上数字后缀。
WangM!n:首字母大写,并加入特殊字符。
mWangMin:将“敏”的拼音置于开头。
Wmi_n23:使用下划线、拼音和数字的组合。
22MingWang:数字开头,并改变“敏”的拼音为“明”。
MinW_888:使用拼音、下划线和重复数字。
W888ingMin:将数字插入拼音之间。
Min7Wang:使用数字将两个拼音分开。
CSV格式输出
将这些密码保存为CSV文件,可以使用文本编辑器或编程脚本。以下是一个简单的CSV文件示例,其中包含了两列:用户名 和 可能密码
熊安一,熊安一
熊安一,xionganyi
熊安一,熊安一123
熊安一,xionganyi123
熊安一,熊安一xionganyi
熊安一,熊安一xionganyi123
熊安一,xay1990
熊安一,wxm1990
王敏,王敏
王敏,wangmin
王敏,王敏123
王敏,wangmin123
王敏,王敏wangmin
王敏,王敏wangmin123
王敏,wm1990
王敏,wmn1990
2. ChatGPT
生成这类密码的Python代码示例,并将其导出为CSV格式
import itertools
import csv
# 定义用户名和拼音组合
usernames = ['熊安一', '王敏']
pinyin_combinations = {
'熊安一': ['xiongan', 'xiongyiyi', 'xiongan1', 'xiongan01', 'xay'],
'王敏': ['wangmin', 'wangmin1', 'wangmin01', 'wm']
}
# 定义可能的密码后缀
suffixes = ['', '123', '2024', '@123', '!']
# 生成密码组合
passwords = []
for username in usernames:
for pinyin in pinyin_combinations[username]:
for suffix in suffixes:
passwords.append(f'{pinyin}{suffix}')
# 写入CSV文件
csv_file = 'password_combinations.csv'
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['username', 'password']) # CSV header
for username in usernames:
for pinyin in pinyin_combinations[username]:
for suffix in suffixes:
writer.writerow([username, f'{pinyin}{suffix}'])
print(f'Passwords have been written to {csv_file}')
运行上面的Python代码将生成一个 password_combinations.csv 文件,内容如下:
username,password
熊安一,xiongan
熊安一,xiongan123
熊安一,xiongan2024
熊安一,xiongan@123
熊安一,xiongan!
熊安一,xiongyiyi
熊安一,xiongyiyi123
熊安一,xiongyiyi2024
熊安一,xiongyiyi@123
熊安一,xiongyiyi!
熊安一,xiongan1
熊安一,xiongan1123
熊安一,xiongan12024
熊安一,xiongan1@123
熊安一,xiongan1!
熊安一,xiongan01
熊安一,xiongan01123
熊安一,xiongan012024
熊安一,xiongan01@123
熊安一,xiongan01!
熊安一,xay
熊安一,xay123
熊安一,xay2024
熊安一,xay@123
熊安一,xay!
王敏,wangmin
王敏,wangmin123
王敏,wangmin2024
王敏,wangmin@123
王敏,wangmin!
王敏,wangmin1
王敏,wangmin1123
王敏,wangmin12024
王敏,wangmin1@123
王敏,wangmin1!
王敏,wangmin01
王敏,wangmin01123
王敏,wangmin012024
王敏,wangmin01@123
王敏,wangmin01!
王敏,wm
王敏,wm123
王敏,wm2024
王敏,wm@123
王敏,wm!
说明
用户名和拼音组合:为每个用户名生成可能的拼音组合(可以根据需要扩展更多组合)。
密码后缀:添加常见的密码后缀,如数字、年份和特殊字符。
生成密码列表:通过嵌套循环生成所有可能的用户名和密码组合。
导出CSV文件:将生成的用户名和密码组合写入CSV文件。
这个方法确保涵盖了多种可能的密码组合,有助于进行安全扫描和弱口令检测
3. 进一步延伸
如我们获取一个集团公司所有用户姓名与生日等敏感信息,很容易生成密码字典。字典可用于登录接口爆破。
三. 基于登录HTTP接口弱口令扫描模块
数据流
旨在对系统的登录HTTP接口进行弱口令扫描,识别可能存在的弱口令并提示管理员进行修复。随着网络安全威胁的不断增加,弱口令扫描成为保障系统安全的关键步骤。
数据流图解释
用户 (User):通过管理界面创建和管理扫描任务。
管理服务 (Management Service):处理用户请求,保存和获取扫描配置和结果,启动扫描任务。
扫描服务 (Scanning Service):根据配置发送HTTP请求尝试弱口令,并记录结果。
数据库服务 (Database Service):存储扫描配置、结果和日志。
目标HTTP接口 (Target HTTP Interface):被扫描的目标系统接口。
用户界面 (User Interface):展示扫描结果和任务状态。
数据流说明
用户通过管理界面与管理服务交互,创建、管理和查看扫描任务。
管理服务将扫描配置和结果保存到数据库,并从数据库中获取信息。
当用户发起扫描任务时,管理服务会通知扫描服务执行扫描。
扫描服务根据配置从数据库获取扫描任务信息,并对目标HTTP接口发送请求。
扫描服务根据响应判断弱口令,并将结果记录到数据库。
最终,管理服务将扫描结果展示给用户。
功能与特性
模块组成
扫描服务:负责发送HTTP请求,尝试不同的弱口令组合,记录扫描结果。
管理服务:提供管理界面和API,配置扫描任务和查看扫描结果。
数据库服务:存储扫描配置、结果和日志。
基本功能
弱口令字典管理:支持导入、导出和编辑弱口令字典。
扫描任务管理:创建、修改和删除扫描任务。
扫描执行:并发执行多个扫描任务。
结果报告:生成并展示扫描报告,提供导出功能。
安全性
身份认证和权限控制:确保只有授权用户可以访问管理界面和API。
日志记录和审计:记录扫描操作日志,提供审计功能。
扩展性
可配置性:支持自定义扫描策略和弱口令字典。
高并发性:支持大规模并发扫描任务。
实现概要设计
扫描服务
扫描服务负责发送HTTP请求,尝试各种弱口令组合。为了提高扫描效率,可以使用多线程和异步IO技术。扫描过程中需要处理以下几个方面:
请求构建:根据配置生成HTTP请求,包括URL、请求头和请求体。
响应处理:解析HTTP响应,根据状态码和响应内容判断登录是否成功。
结果记录:记录成功和失败的尝试,生成扫描报告。
管理服务
管理服务提供管理界面和API,支持用户配置扫描任务和查看扫描结果。管理服务需要实现以下功能:
用户管理:支持用户注册、登录、身份验证和权限管理。
扫描任务管理:提供界面和API,支持创建、修改和删除扫描任务。
结果展示:展示扫描结果,支持按任务、时间和状态筛选。
数据库服务
数据库服务负责存储扫描配置、结果和日志。需要设计以下几张主要表:
用户表:存储用户信息。
任务表:存储扫描任务配置信息。
结果表:存储扫描结果。
日志表:存储操作日志。
四. 应用系统中如何实现密码复杂度判断
JAVA
hutools开源工具类中密码复杂度判断
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.29</version>
</dependency>
https://plus.hutool.cn/apidocs/cn/hutool/core/text/PasswdStrength.html
Passay
Passay 是一个Java库,用于验证密码复杂度。
<dependency>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
<version>1.6.4</version>
</dependency>
示例:
import org.passay.*;
public class PasswordValidatorExample {
public static void main(String[] args) {
PasswordValidator validator = new PasswordValidator(
new LengthRule(8, 30),
new CharacterRule(EnglishCharacterData.UpperCase, 1),
new CharacterRule(EnglishCharacterData.LowerCase, 1),
new CharacterRule(EnglishCharacterData.Digit, 1),
new CharacterRule(EnglishCharacterData.Special, 1),
new WhitespaceRule()
);
String password = "Password@123";
RuleResult result = validator.validate(new PasswordData(password));
if (result.isValid()) {
System.out.println("Password is valid.");
} else {
System.out.println("Password is invalid: " + String.join(", ", validator.getMessages(result)));
}
}
}
JavaScript
zxcvbn 是由Dropbox开发的一个强大的JavaScript库,用于评估密码强度。
NPM安装npm install zxcvbn
示例代码
const zxcvbn = require('zxcvbn');
const password = 'Password@123';
const result = zxcvbn(password);
console.log(`Password strength score: ${result.score}`);
console.log('Feedback:', result.feedback.suggestions.join(' '));
Python
pip install password-strength
from password_strength import PasswordPolicy
policy = PasswordPolicy.from_names(
length=8, # min length: 8
uppercase=1, # need min. 1 uppercase letters
numbers=1, # need min. 1 digits
special=1, # need min. 1 special characters
nonletters=0 # need min. 0 non-letter characters (digits, specials, anything)
)
password = "Password@123"
result = policy.test(password)
if not result:
print("Password is valid.")
else:
print("Password is invalid:", result)
Golang
zxcvbn-gozxcvbn-go
是一个Golang的密码强度评估库,基于Dropbox的 zxcvbn
。
安装go get -u github.com/nbutton23/zxcvbn-go
示例代码
package main
import (
"fmt"
"github.com/nbutton23/zxcvbn-go"
)
func main() {
password := "Password@123"
result := zxcvbn.PasswordStrength(password, nil)
fmt.Printf("Password strength score: %d\n", result.Score)
fmt.Println("Feedback:", result.Feedback.Suggestions)
}。
改进建议
防止暴力破解攻击
如果攻击者能够在账户未因认证尝试失败而禁用的情况下猜测密码,攻击者就有机会继续进行暴力破解攻击,直到账户被破坏。在Web应用程序上自动化暴力破解/密码猜测攻击是一个微不足道的挑战。应采用密码锁定机制,如果进行了超过预设数量的不成功登录尝试,则锁定账户。密码锁定机制有一个逻辑弱点。攻击者对已知账户名进行大量认证尝试,可能会产生锁定整个用户账户区块的结果。鉴于密码锁定系统的目的是从暴力破解攻击中保护,一个明智的策略是让账户在一段时间后(例如,20分钟)锁定。这大大减慢了攻击者的速度,同时允许账户自动重新开放给合法用户。
此外,多因素认证是防止暴力破解攻击的非常有力的威慑,因为凭证是一个移动目标。当多因素实现并激活时,账户锁定可能不再必要。
日志记录和监控
启用认证功能的日志记录和监控,以实时检测攻击/失败
确保所有失败都被记录和审查
确保所有密码失败都被记录和审查
确保所有账户锁定都被记录和审查
要求对敏感功能进行重新认证
为了缓解CSRF和会话劫持,重要的是在更新敏感账户信息(例如用户的密码、用户的电子邮件)或在敏感交易(例如将购买的商品运送到新地址)之前,需要当前账户的凭据。如果没有这种对策,攻击者可能能够在不知道用户当前凭据的情况下,通过CSRF或XSS攻击执行敏感交易。此外,攻击者可能暂时物理访问用户的浏览器或窃取他们的会话ID以接管用户的会话。
其它参考
https://github.com/k8gege/PasswordDicordDic
https://github.com/NepoloHebo/Commonly-used-weak-password-dictionary