乐趣区

关于安全:人脸识别技术风险及提升安全手段

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

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

下面是实现了多因素身份验证的其中两个因素,即滑动验证码和人脸识别。依据理论需要,可能还须要增加其余因素,例如指纹识别、声音辨认等等。

另外,须要依据理论状况进行调整和优化,例如对于滑动验证码局部须要增加验证码生成和验证的逻辑,对于人脸识别局部须要依据具体的人脸识别算法进行调整。

结语

以上就是人脸识别技术晋升平安的几个伎俩,其实只是一个“引子”,具体的晋升伎俩是一个非常复杂的零碎。如果能够,能够尝试一套风控引擎零碎:风控引擎

退出移动版