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ộ
- Đếm các điểm sinh trắc học
- Tái định lượng không gian
- Tái định lượng góc
- 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
posDataTemplate = 0x12; // DEC=18
ANSI INCITS 378-2004
cpp
posDataTemplate = 0x14; // DEC=20
Đếm các điểm sinh trắc học
cpp
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
// 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
CoordMM = 10 * Coord / RES;
CoordUNITS = CoordMM / 0.1;
CoordCC = 0.5 + CoordUNITS;
Tính toán độ phân giải mẫu:
cpp
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
*pcoordmmX = 10.0 * (double) *ptmpx / xres;
*pcoordunitsX = *pcoordmmX / 0.1;
*pcoordccX = (short)(.5 + *pcoordunitsX);
Tọa độ Y:
cpp
*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
360/64 = 5.625°
cpp
float ISOCC_ANGLE_RESOLUTION = 5.625f;
Đối với ISO/IEC 19794-2:2005:
cpp
360/256 = 1.40625°
cpp
ANGLE_RESOLUTION = 1.40625f;
Đối với ANSI INCITS 378-2004:
cpp
360/180 = 2°
cpp
ANGLE_RESOLUTION = 2;
Tính toán cuối cùng:
cpp
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
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
__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-2004fTemplate
: Con trỏ tới mẫu gốcsorting
: 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
__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
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!