因为人脸识别技术出现的风险问题,屡见不鲜。之前广州互联网法院通报了一起因为“刷脸”引发的借款纠纷。客户王兰(化名)在遗失了身份证后,却被人冒用身份通过银行的“人脸识别”贷款,导致王兰因逾期被告上了法庭。经司法笔迹鉴定,认为案涉客户签名并非王兰本人签署,手机号码亦未曾登记在王兰名下。最终,法院驳回银行全部诉讼请求。

前几年,还有一个新闻,四川警方查处一个上百人的诈骗团伙。该团伙购买大量人脸视频,借助“僵尸企业”“空壳公司”,为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()

上面是实现了多因素身份验证的其中两个因素,即滑动验证码和人脸识别。根据实际需求,可能还需要添加其他因素,例如指纹识别、声音识别等等。

另外,需要根据实际情况进行调整和优化,例如对于滑动验证码部分需要添加验证码生成和验证的逻辑,对于人脸识别部分需要根据具体的人脸识别算法进行调整。

结语

以上就是人脸识别技术提升安全的几个手段,其实只是一个“引子”,具体的提升手段是一个非常复杂的系统。如果可以,可以尝试一套风控引擎系统:风控引擎


小飞象
80 声望5 粉丝