共计 5886 个字符,预计需要花费 15 分钟才能阅读完成。
因为人脸识别技术呈现的危险问题,不足为奇。之前广州互联网法院通报了一起因为“刷脸”引发的借款纠纷。客户王兰(化名)在遗失了身份证后,却被人冒用身份通过银行的“人脸识别”贷款,导致王兰因逾期原告上了法庭。经司法笔迹鉴定,认为案涉客户签名并非王兰自己签订,手机号码亦未曾注销在王兰名下。最终,法院驳回银行全副诉讼请求。
前几年,还有一个新闻,四川警方查处一个上百人的欺骗团伙。该团伙购买大量人脸视频,借助“僵尸企业”“空壳公司”,为 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()
下面是实现了多因素身份验证的其中两个因素,即滑动验证码和人脸识别。依据理论需要,可能还须要增加其余因素,例如指纹识别、声音辨认等等。
另外,须要依据理论状况进行调整和优化,例如对于滑动验证码局部须要增加验证码生成和验证的逻辑,对于人脸识别局部须要依据具体的人脸识别算法进行调整。
结语
以上就是人脸识别技术晋升平安的几个伎俩,其实只是一个“引子”,具体的晋升伎俩是一个非常复杂的零碎。如果能够,能够尝试一套风控引擎零碎:风控引擎