因为人脸识别技术出现的风险问题,屡见不鲜。之前广州互联网法院通报了一起因为“刷脸”引发的借款纠纷。客户王兰(化名)在遗失了身份证后,却被人冒用身份通过银行的“人脸识别”贷款,导致王兰因逾期被告上了法庭。经司法笔迹鉴定,认为案涉客户签名并非王兰本人签署,手机号码亦未曾登记在王兰名下。最终,法院驳回银行全部诉讼请求。
前几年,还有一个新闻,四川警方查处一个上百人的诈骗团伙。该团伙购买大量人脸视频,借助“僵尸企业”“空壳公司”,为6000多人包装公积金信息,然后向多家银行申请公积金贷款,最终带来10亿多元的坏账。
就离谱是吧,但是人脸识别带来的风险是绝对不可忽视的。我们确实有必要掌握一些手段来多方面提升人脸识别应用安全。
人脸识别技术的风险
人脸识别已经成为登录、确认、申请、修改等业务环节中重要的验证技术,同时也存各类安全风险。
有媒体报道,大量社群和境外网站进行真人人脸识别视频的贩卖。“价高质优”的验证视频百元一套,动态软件将人脸照片制作成“动态视频”只要几元,以完成各类线上业务人脸识别的验证。此外,清华大学研究人员曾经在15分钟解锁了19个陌生智能手机。
可以清楚地看到,人脸识别技术带来人们便利的同时,也要带来的各类仿冒、攻击、盗取等三类安全隐患。
仿冒登录。 戴上眼镜、帽子、面具等伪装手段,或者可以制作人皮高仿模型、将2D人脸照片3D建模、利用AI技术将静态照片变成动态照片等多种技术均,混淆算法判断,达到欺骗系统的目的。可以骗过有效性不高的人脸识别算法和活体监测算法。
劫持篡改。 远程入侵篡改人脸识别系统验证流程、信息、数据等,将后台或前端的真数据替换为假数据,以实现虚假人脸信息的通过。
盗取冒用。 通过各类公开或非法手段,收集、保存、盗取正常的人脸数据,然后非法冒用。
由于人脸的结构、外形相似,并且脸部表情、角度、光线、环境、穿戴、年龄的因素,导致人脸的视觉图像也相差很大。因此,外部客观因素对人脸识别也带来较多影响。
多方面提升人脸识别应用安全
人脸识别是一个很大的话题,关于这方面的应用安全提升,是一个很大的话题,本次文章就简单介绍一个方式(具体需要结合应用场景使用)。
1. 加强面部特征信息的加密和存储
使用 OpenCV 库进行人脸识别,并通过哈希函数对面部特征信息进行加密。
import cv2
import hashlib
# 加载人脸识别模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 加载图像
img = cv2.imread('face.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行人脸识别
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 将人脸图像进行哈希
for (x,y,w,h) in faces:
face_img = img[y:y+h, x:x+w]
face_hash = hashlib.sha256(face_img).hexdigest()
print(face_hash)
2. 检测面部特征信息的伪造
使用 Python 和 OpenCV 库对人脸图像进行特征提取,并检测面部特征信息的伪造:
import cv2
import numpy as np
from imutils import face_utils
# 加载人脸识别模型
detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 加载图像
img = cv2.imread('face.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行人脸检测
faces = detector.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 对每张人脸进行特征提取
for (x, y, w, h) in faces:
# 使用 dlib 库获取面部特征点
rect = dlib.rectangle(int(x), int(y), int(x + w), int(y + h))
landmarks = predictor(gray, rect)
landmarks = face_utils.shape_to_np(landmarks)
# 计算面部特征点之间的距离
distances = []
for i in range(landmarks.shape[0]):
for j in range(i+1, landmarks.shape[0]):
distances.append(np.linalg.norm(landmarks[i] - landmarks[j]))
# 计算面部特征点之间距离的平均值和标准差
mean_distance = np.mean(distances)
std_distance = np.std(distances)
# 判断面部特征信息是否被伪造
if mean_distance < 40 or std_distance > 10:
print('Face features have been tampered with')
else:
print('Face features are authentic')
3.多因素身份验证
先是滑动验证码
import cv2
import hashlib
import os
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import face_recognition
# 加载人脸图像和对应的姓名
known_face_encodings = []
known_face_names = []
image_filenames = os.listdir('known_faces')
for filename in image_filenames:
if filename.endswith('.jpg') or filename.endswith('.png'):
image_path = os.path.join('known_faces', filename)
image = face_recognition.load_image_file(image_path)
face_encoding = face_recognition.face_encodings(image)[0]
known_face_encodings.append(face_encoding)
name = os.path.splitext(filename)[0]
known_face_names.append(name)
# 加载浏览器驱动
driver = webdriver.Chrome()
# 打开登录页面
driver.get('https://example.com/login')
# 等待页面加载完成
time.sleep(3)
# 输入用户名和密码
driver.find_element_by_name('username').send_keys('your_username')
driver.find_element_by_name('password').send_keys('your_password')
# 点击滑动验证码
slider = driver.find_element_by_class_name('slider')
ActionChains(driver).click_and_hold(slider).perform()
# 获取验证码背景图和滑块图
bg_image_src = driver.find_element_by_class_name('puzzle-bg-image').get_attribute('src')
slider_image_src = driver.find_element_by_class_name('puzzle-slider-image').get_attribute('src')
# 下载验证码背景图和滑块图
bg_image_content = driver.execute_script('return fetch(arguments[0]).then(response => response.blob())', bg_image_src)
slider_image_content = driver.execute_script('return fetch(arguments[0]).then(response => response.blob())', slider_image_src)
bg_image_filename = hashlib.md5(bg_image_content).hexdigest() + '.jpg'
slider_image_filename = hashlib.md5(slider_image_content).hexdigest() + '.png'
with open(bg_image_filename, 'wb') as f:
f.write(bg_image_content)
with open(slider_image_filename, 'wb') as f:
f.write(slider_image_content)
# 使用 OpenCV 匹配滑块位置
bg_image = cv2.imread(bg_image_filename)
slider_image = cv2.imread(slider_image_filename)
result = cv2.matchTemplate(bg_image, slider_image, cv2.TM_CCOEFF_NORMED)
_, _, _, max_loc = cv2.minMaxLoc(result)
slider_offset_x = max_loc[0] + slider_image.shape[1] / 2
slider_offset_y = max_loc[1] + slider_image.shape[0] / 2
# 模拟滑动验证码操作
ActionChains(driver).move_by_offset(slider_offset_x, slider_offset_y).perform()
ActionChains(driver).release().perform()
# 等待滑块验证成功
time.sleep(3)
# 获取当前用户的人脸图像
current_user_image_src = driver.find_element_by_id('user-face-image').get_attribute('src')
current_user_image_content = driver.execute_script('return fetch(arguments[0]).then(response => response.blob())', current_user_image_src)
current_user_image_filename = hashlib.md5(current_user_image_content).hexdigest() + '.jpg'
with open(current_user_image_filename, 'wb') as f:
f.write(current_user_image_content)
人脸识别
import cv2
import numpy as np
import requests
# 读取摄像头数据
cap = cv2.VideoCapture(0)
# 加载人脸识别模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 读取样本人脸数据
img_url = 'https://example.com/sample_face.jpg'
img_resp = requests.get(img_url)
img_array = np.array(bytearray(img_resp.content), dtype=np.uint8)
sample_face = cv2.imdecode(img_array, -1)
# 缩小样本人脸图像尺寸
sample_face = cv2.resize(sample_face, (0, 0), fx=0.5, fy=0.5)
while True:
# 读取摄像头图像
ret, frame = cap.read()
# 转换图像格式
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 识别人脸
for (x, y, w, h) in faces:
# 裁剪人脸区域
roi_gray = gray[y:y+h, x:x+w]
# 缩小人脸图像尺寸
roi_gray = cv2.resize(roi_gray, (0, 0), fx=0.5, fy=0.5)
# 计算人脸相似度
similarity = compare_faces(sample_face, roi_gray)
# 判断是否识别成功
if similarity > 0.8:
print('人脸识别成功')
# TODO: 执行后续操作
else:
print('人脸识别失败')
# 显示图像
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头
cap.release()
# 关闭窗口
cv2.destroyAllWindows()
上面是实现了多因素身份验证的其中两个因素,即滑动验证码和人脸识别。根据实际需求,可能还需要添加其他因素,例如指纹识别、声音识别等等。
另外,需要根据实际情况进行调整和优化,例如对于滑动验证码部分需要添加验证码生成和验证的逻辑,对于人脸识别部分需要根据具体的人脸识别算法进行调整。
结语
以上就是人脸识别技术提升安全的几个手段,其实只是一个“引子”,具体的提升手段是一个非常复杂的系统。如果可以,可以尝试一套风控引擎系统:风控引擎
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。