以子之矛攻子之盾
上个礼拜因为家里的老人有感而发,思考了验证码适老化方面的改造。最近在思考AIGC在验证码方面的应用。
传统的验证码,总的来说,因为通常是将数字、字母、符号等随机组合在一起,形成一个图像,要求用户输入其中的内容。这种方式对于人类用户来说比较容易识别,但对于机器来说却很难识别,因此可以防止机器人攻击。
但是,传统的验证码技术已经被机器学习技术所攻破。一些恶意程序可以使用图像处理算法,将验证码图像进行分割、识别,从而成功攻击目标系统。
这个时候,我们就需要“以子之矛攻子之盾”,看看能不能利用AIGC提高验证码的可用性和安全性。
AIGC的具体应用
AIGC具体是什么我就不介绍了,不知道的自行百度即可。接下来我们直接进入正题,来看看AIGC怎么在验证码的应用(主要指的是图片验证码)。
1.提高验证码复杂度
我们可以利用AIGC生成更复杂的验证码,如加入噪声、干扰线、曲线等,增加破解难度,从而去提高验证码的安全性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from captcha.image import ImageCaptcha
import random
# 生成复杂验证码
def generate_complex_captcha():
captcha = ImageCaptcha(width = 200 , height = 50 )
captcha_text = ' '.join(random.sample(' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 4 ))
captcha_image = captcha.generate_image(captcha_text)
captcha_image = captcha.create_noise_curve(captcha_image, captcha_image.getcolors())
captcha_image = captcha.create_noise_dots(captcha_image, captcha_image.getcolors())
captcha_image = captcha.create_captcha_image(captcha_text, 'black' , captcha_image.getcolors())
return captcha_text, captcha_image
# 保存复杂验证码
captcha_text, captcha_image = generate_complex_captcha()
captcha_image.save(captcha_text + '.png' )
|
2.集成多种验证码类型
使用AIGC集成多种类型的验证码,如文字、数字、图形、音频等,使验证码更加丰富多样,增加破解难度,提高验证码的安全性。
这个功能其实现有传统的验证码也有,即,通过人工设计算法来实现生成多种类型的验证码,但是这种生成方式目前真的都是已知的攻击方式。
而AIGC可以通过学习数据集中的特征和模式,自动学习生成各种类型的验证码,甚至可以应对未知的攻击方式。此外,AIGC还可以使用集成学习(下面会讲)的方式,通过多个模型的组合来提高分类准确性和抗攻击能力。因此,AIGC相较于传统的验证码技术在自适应性、鲁棒性和安全性等方面更具优势。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
from captcha.audio import AudioCaptcha
from captcha.image import ImageCaptcha
import random
# 生成多种类型验证码
def generate_multiple_captchas():
captcha_type = random.choice([ 'audio' , 'image' ])
if captcha_type = = 'audio' :
captcha = AudioCaptcha()
captcha_text = ' '.join(random.sample(' 0123456789 ', 4 ))
captcha_data = captcha.generate(captcha_text)
else :
captcha = ImageCaptcha()
captcha_text = ' '.join(random.sample(' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 4 ))
captcha_data = captcha.generate(captcha_text)
return captcha_type, captcha_text, captcha_data
# 保存多种类型验证码
captcha_type, captcha_text, captcha_data = generate_multiple_captchas()
if captcha_type = = 'audio' :
with open (captcha_text + '.wav' , 'wb' ) as f:
f.write(captcha_data)
else :
captcha_data.save(captcha_text + '.png' )
|
3.自适应学习
就像第二点说的,使用AIGC进行自适应学习,从而对新型验证码进行快速识别,提高验证码的可用性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
import numpy as np
# 加载数据集
X = load_dataset()
# 划分训练集和测试集
X_train, X_test = train_test_split(X, test_size = 0.2 , random_state = 42 )
# 构建分类器
clf = MLPClassifier(hidden_layer_sizes = ( 100 ,), max_iter = 1000 , alpha = 1e - 4 , solver = 'adam' , tol = 1e - 4 , random_state = 42 )
# 训练分类器
clf.fit(X_train, y_train)
# 测试分类器
score = clf.score(X_test, y_test)
print ( 'Test accuracy:' , score)
# 使用分类器进行自适应学习
new_captcha = load_new_captcha()
if clf.predict(new_captcha) = = 1 :
# 验证码为正常值,加入数据集进行自适应学习
X = np.concatenate([X, new_captcha])
y = np.concatenate([y, [ 1 ]])
clf.fit(X, y)
|
4.模型集成
使用AIGC进行模型集成,将多个分类模型进行集成,提高验证码的分类准确率,这也是为了验证码的安全考虑。
1
2
3
4
5
6
7
8
9
10
11
|
from sklearn.ensemble import VotingClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import numpy as np
# 加载数据集
X = load_dataset()
# 划分训练集和测试集
X_train, X_test, y_train,
|
5.异常检测
使用AIGC进行异常检测出异常的验证码,防止恶意攻击者利用验证码进行攻击。
这个步骤会比较繁琐。其实,还有一种方法可以做异常检测,那就是基于聚类的异常检测方法。不过采用机器学习的方法会更常用于验证码。
这一块的步骤会比较繁琐,我们先简单过一下步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import numpy as np
import pandas as pd
from sklearn.svm import OneClassSVM
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 读取数据
data = pd.read_csv( 'captcha_dataset.csv' )
# 划分数据集
train_data = data[: 800 ]
val_data = data[ 800 : 900 ]
test_data = data[ 900 :]
# 提取特征
X_train = train_data.drop(columns = [ 'label' ]).values
X_val = val_data.drop(columns = [ 'label' ]).values
X_test = test_data.drop(columns = [ 'label' ]).values
# 训练模型
clf = OneClassSVM(kernel = 'rbf' , gamma = 0.1 , nu = 0.1 )
clf.fit(X_train)
# 测试模型
y_pred_train = clf.predict(X_train)
y_pred_val = clf.predict(X_val)
y_pred_test = clf.predict(X_test)
# 计算性能指标
print ( 'Training set performance:' )
print ( 'Accuracy: {:.2f}' . format (accuracy_score(np.ones( len (X_train)), y_pred_train)))
print ( 'Precision: {:.2f}' . format (precision_score(np.ones( len (X_train)), y_pred_train)))
print ( 'Recall: {:.2f}' . format (recall_score(np.ones( len (X_train)), y_pred_train)))
print ( 'F1 score: {:.2f}' . format (f1_score(np
|
结语
从收集到的资料来看,AIGC主要是能从以上几个方面来提高验证码的安全性和可用性。整体来说,人工智能的发展还是非常迅速的,目前第五代无感验证码或许很快就要被“抛之脑后”了。
我们啊,要活到老,学到死。
免费的验证码插件:滑动&图片验证码