0
0
Lập trình
Admin Team
Admin Teamtechmely

Xác thực vân tay sinh trắc học trên chip SmartCard

Đăng vào 2 ngày trước

• 4 phút đọc

Giới thiệu

Trong giai đoạn từ 2013 đến 2018, tôi đã tham gia vào nhiều dự án liên quan đến thẻ thông minh dựa trên chip thẻ thông minh theo tiêu chuẩn ISO/IEC 7816-4. Hôm nay, tôi muốn giới thiệu thư viện SEP7US, một thư viện tôi đã phát triển để thực hiện xác thực sinh trắc học trên thẻ thông minh, tuân theo hướng dẫn MINEX của NIST.

Tác giả

  • Julio Chinchilla

Kho lưu trữ dự án

Bạn có thể tìm thấy dự án đầy đủ tại: GitHub - SEP7US

Tôi thấy rất quan trọng khi giải thích ngắn gọn cách thức hoạt động của thư viện này, vì có rất ít tài liệu công khai về các tiêu chuẩn sinh trắc học.

Tuyên bố miễn trừ trách nhiệm

Thư viện SEP7US Match on Card 0x7E3

Bất kỳ sửa đổi nào mà không có sự giám sát hoặc đồng ý đúng cách đều là rủi ro của bạn. Việc thay đổi mã sẽ làm thay đổi đáng kể kết quả xác thực trên bất kỳ ứng dụng Smart Card PIV nào.

Ngôn ngữ và Công cụ

  • C++
  • Java Native Interface (JNI)

Mục đích

SEP7US cung cấp một thư viện phụ trợ để chuyển đổi các mẫu sinh trắc học:

  • ISO/IEC 19794-2:2005
  • ANSI INCITS 378-2004

sang định dạng ISOCC cần thiết cho xác thực sinh trắc học trên thẻ dựa trên tiêu chuẩn ISO/IEC 7816-4.

Quy trình nội bộ

  1. Đếm các điểm sinh trắc học
  2. Tái định lượng không gian
  3. Tái định lượng góc
  4. Sắp xếp các điểm sinh trắc học

Nhận diện mẫu

Việc xác định vị trí bắt đầu của dữ liệu sinh trắc học tùy thuộc vào loại mẫu:

ISO/IEC 19794-2:2005

cpp Copy
posDataTemplate = 0x12; // DEC=18

ANSI INCITS 378-2004

cpp Copy
posDataTemplate = 0x14; // DEC=20

Đếm các điểm sinh trắc học

cpp Copy
short numMinutiae = (short) fTemplate[posDataTemplate+9] & 0xFF;

Kích thước mảng cho mẫu ISOCC sẽ được xác định bởi:

cpp Copy
// numMinutiae
short sizeISOCC = numMinutiae * 3;  // (X, Y, T|A)

Tái định lượng không gian

Quá trình này diễn tả tọa độ các điểm sinh trắc học theo đơn vị 0.1mm.

Công thức cơ bản:

cpp Copy
CoordMM      = 10 * Coord / RES;
CoordUNITS   = CoordMM / 0.1;
CoordCC      = 0.5 + CoordUNITS;

Tính toán độ phân giải mẫu:

cpp Copy
short xres = (short) (fTemplate[posDataTemplate+0] << 8 | fTemplate[posDataTemplate+1]) & 0xFF;
short yres = (short) (fTemplate[posDataTemplate+2] << 8 | fTemplate[posDataTemplate+3]) & 0xFF;

Tọa độ X:

cpp Copy
*pcoordmmX    = 10.0 * (double) *ptmpx / xres;
*pcoordunitsX = *pcoordmmX / 0.1;
*pcoordccX    = (short)(.5 + *pcoordunitsX);

Tọa độ Y:

cpp Copy
*pcoordmmY    = 10.0 * (double) *ptmpy / yres;
*pcoordunitsY = *pcoordmmY / 0.1;
*pcoordccY    = (short)(.5 + *pcoordunitsY);

Tái định lượng góc

Quá trình tái định lượng góc đại diện cho các góc của các điểm sinh trắc học trong 6 bit (0–63), với giá trị tối đa là 360°.

Độ phân giải góc ISOCC:

cpp Copy
360/64 = 5.625°
cpp Copy
float ISOCC_ANGLE_RESOLUTION = 5.625f;

Đối với ISO/IEC 19794-2:2005:

cpp Copy
360/256 = 1.40625°
cpp Copy
ANGLE_RESOLUTION = 1.40625f;

Đối với ANSI INCITS 378-2004:

cpp Copy
360/180 = 2°
cpp Copy
ANGLE_RESOLUTION = 2;

Tính toán cuối cùng:

cpp Copy
tmpCAngle = ANGLE_RESOLUTION * (*ptmpa);
tmpFAngle = tmpCAngle / ISOCC_ANGLE_RESOLUTION;
short t   = (*ptmpt | tmpFAngle) & 0xFF;

Sắp xếp các điểm sinh trắc học

Mặc dù một số thẻ thông minh không yêu cầu sắp xếp, SEP7US cung cấp bốn hàm sắp xếp chính:

cpp Copy
void XYAsc(unsigned char *a, short n);  // X tăng dần
void XYDsc(unsigned char *a, short n);  // X giảm dần
void YXAsc(unsigned char *a, short n);  // Y tăng dần
void YXDsc(unsigned char *a, short n);  // Y giảm dần

Phương pháp bên ngoài

ISOCC

Tạo một mẫu thẻ ISO Compact Card.

cpp Copy
__declspec(dllexport) unsigned char *ISOCC(
    unsigned char templateFormat,
    unsigned char *fTemplate,
    unsigned char sorting
);

Tham số:

  • templateFormat: 0xFF cho ISO/IEC 19794-2:2005, 0x7F cho ANSI INCITS 378-2004
  • fTemplate: Con trỏ tới mẫu gốc
  • sorting: Tùy chọn sắp xếp (0x00, 0x0F, 0x10, 0x1F)

Xác thực

Tạo một mẫu ISOCC với tiêu đề APDU ISO/IEC 7816-4 cho xác thực PIV.

cpp Copy
__declspec(dllexport) unsigned char *Verify(
    unsigned char CLA,
    unsigned char INS,
    unsigned char P1,
    unsigned char P2,
    unsigned char templateFormat,
    unsigned char *fTemplate,
    unsigned char sorting
);

Lệnh APDU mặc định: 0x00 0x21

Tiêu đề đã thêm:

cpp Copy
7F2E : "Mẫu dữ liệu sinh trắc học"

Giấy phép

MIT

Thực hành tốt nhất

  • Khi sử dụng thư viện SEP7US, hãy đảm bảo rằng bạn đã hiểu rõ về các tiêu chuẩn sinh trắc học để tránh sai sót trong việc xác thực.
  • Kiểm tra mã thường xuyên để phát hiện lỗi sớm.

Những cạm bẫy thường gặp

  • Không kiểm tra độ chính xác của dữ liệu vân tay trước khi đưa vào hệ thống có thể dẫn đến xác thực sai.
  • Bỏ qua việc sắp xếp các điểm sinh trắc học có thể ảnh hưởng đến hiệu suất xác thực.

Mẹo hiệu suất

  • Tối ưu hóa mã bằng cách kiểm tra và loại bỏ các phần không cần thiết để cải thiện tốc độ xử lý.
  • Sử dụng các thuật toán tối ưu cho việc sắp xếp và tính toán để giảm thời gian xử lý tổng thể.

Câu hỏi thường gặp

SEP7US là gì?

SEP7US là một thư viện hỗ trợ xác thực sinh trắc học trên thẻ thông minh.

Có cần kiến thức về lập trình để sử dụng SEP7US không?

Có, kiến thức về C++ và JNI là cần thiết để sử dụng thư viện này hiệu quả.

Kết luận

Thư viện SEP7US mang lại giải pháp hiệu quả cho việc xác thực sinh trắc học trên thẻ thông minh. Để tìm hiểu thêm và đóng góp, hãy tham gia vào cộng đồng phát triển và chia sẻ ý kiến của bạn. Hãy bắt đầu hành trình phát triển của bạn ngay hôm nay!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào