델파이에서 지문센서 2차 개발
1. 지문 센서 소개
지문은 '최초의 물리적 증거'라는 명성을 갖고 있다. 지문에 대한 과학계의 결론은 다음과 같습니다. 지구상에 50억 명의 인구가 있다고 가정하면 두 개의 동일한 지문이 나타나는 데는 300년이 걸립니다. 지문의 고유성은 반박할 수 없는 지위를 갖고 있음을 알 수 있다.
지문 센서는 우리가 처음으로 알고 있는 디지털 보안 시스템을 변화시켰습니다. 이전에는 모든 것이 비밀번호에 의존했습니다. 자신의 사용자 이름을 사용하고 시스템을 구성해야 합니다. 다른 사람이 귀하의 비밀번호를 볼 수 없도록 키보드를 덮어야 합니다. 하지만, 주의하지 않으면 누구나 귀하의 비밀번호를 도용할 수 있습니다.
관련 전문가들은 "지문인식 시스템을 통해 가정과 기업 컴퓨터 사용자의 보안 요구가 확대됐다"며 "머지않아 근거리통신망이든 인터넷이든, 보안 데이터 등록이나 접근이든, 그렇게 하는 것은 불가능할 것입니다." 더 이상 비밀번호가 필요하지 않습니다. 손가락만 터치하면 됩니다."
2. 지문스캐너 2차 개발 소개
현재 전 세계에는 많은 지문 스캐너 제조업체가 있으며 그 영향력이 가장 큽니다. DigitalPersona의 U.are.U 시리즈는 이미 세계 최대의 컴퓨터 키보드 제조업체입니다. DigitalPersona의 U.are.U 지문 감지 보안 시스템을 HP, Compaq, IBM 등을 위해 제작된 키보드에 통합하기 위한 Chicony Electronics와의 계약에 포함되었습니다.
본 글에서 소개하는 지문센서의 2차 개발은 DigitalPersona의 U.are.U 2000을 기반으로 한 것이다. U.are.U는 you are you(you are you)의 약자인 U.are.U 2000 Micro Fingerprint Collection이다. 장치는 자동으로 지문 이미지를 판독하고 USB 인터페이스를 통해 디지털 지문 이미지를 컴퓨터로 전송할 수 있습니다. 인증이 필요한 노트북, 데스크탑 또는 기타 PC 장치에 이상적인 액세서리입니다.
U.are.U 2000은 저가형, 컴팩트형 지문인식기입니다. U.are.U 2000 지문 스캐닝 컬렉션은 정밀 광학 시스템, LED 광원 및 CMOS 카메라를 통합하여 이미지 캡처 중 전압 제어 및 자동 보정을 수행하고 플러그 앤 플레이 USB 인터페이스를 사용하도록 설계되었습니다. DigitalPersona U.are.U 지문 인식 알고리즘, 응용 프로그램 및 DigitalPersona UAM(범용 인증 관리자)에 대한 인터페이스 - 이러한 지문 관련 응용 프로그램에는 Windows가 포함됩니다. 로그인, 화면 잠금, 비밀번호 교체 및 암호화된 디스크 드라이브.
지문 센서 하드웨어 제품을 구매할 때 판매자는 일반적으로 하드웨어 드라이버, 제품 설명서, 보조 개발 키트 및 개발 프로그램 예제를 포함합니다. 소프트웨어 개발 키트(SDK)를 통해 애플리케이션에 지문인식 기능을 추가할 수 있다.
3. 지문스캐너 2차 개발과정의 핵심기술
1.dll 호출
먼저 델파이에서 지문센서 개발킷에 있는 DLL을 호출하는 방법을 소개하겠습니다. uruShell.dll을 개발 패키지의 프로그램 디렉터리 또는 시스템 디렉터리에 넣습니다. 명확성을 위해 DLL 호출 문은 uruShell.dll의 기능이 내보내지고 관련 참조 문이 작성되는 프로그램 단위 Shelluru.pas에 집중되어 있습니다. 구체적인 소스 코드는 다음과 같습니다.
단위 Shelluru;
인터페이스
창, 메시지를 사용합니다.
const
FT_OK = 0; // 성공
FT_ERR_NO_INIT = -1; // 초기화 없음
FT_ERR_UNKNOWN_DEVICE = -10; // 알 수 없는 장치
FT_ERR_DEVICE_CONNECTED = -18; // 장치가 연결되었습니다.
FT_ERR_NO_DEVICE_CONNECTED = -19; // 연결할 수 있는 장치가 없습니다.
MAX_REGISTER_COUNT= 8; // 최대 레지스터 수
ERR_REGISTER_FAIL= -110; // 등록 실패
ERR_VERIFY_FAIL= -111; // 확인 실패
ERR_REGISTER_COUNT= -112; // 등록 수
{다음은 커스텀 메시지, MSG_FINGER_CAPTURED 지문 획득 메시지 }MSG_WAITING_FOR_IMAGE 지문 대기 메시지입니다.
MSG_FINGER_CAPTURED= WM_USER + 80;
MSG_WAITING_FOR_IMAGE= WM_USER + 81;
유형
PRegisterPixels = ^TRegisterPixels;
TRegisterPixels = 포인터 배열[1..MAX_REGISTER_COUNT];
///uru_Init는 지문 센서를 초기화합니다. 매개변수: numOfDev는 컴퓨터에 연결된 지문 센서의 수를 반환합니다. FeatureLen은 지문 데이터 길이를 반환합니다.
function uru_Init(var numOfDev, FeatureLen: 정수): 정수;
///uru_Connect는 특정 지문 센서에 연결됩니다. 매개변수: DeviceNo 지문 센서 번호.
function uru_Connect(DeviceNo: 정수): 정수;
///uru_Terminate가 지문 센서와의 연결을 끊습니다. 매개변수: DeviceNo 지문 센서 번호.
절차 uru_Terminate(DeviceNo: 정수);
///uru_AllocFeature는 지문 데이터 주소를 할당합니다. 매개변수: 기능에 의해 반환된 주소 포인터.
절차 uru_AllocFeature(var 기능: 포인터);
///uru_FreeFeature는 할당된 주소를 해제합니다. 매개변수: 기능에 의해 반환된 주소 포인터.
절차 uru_FreeFeature(var 기능: 포인터);
///uru_GetImageWidth는 지문 이미지 너비를 가져옵니다.
함수 uru_GetImageWidth: 정수;
///uru_GetImageHeight는 지문 이미지 높이를 가져옵니다.
함수 uru_GetImageHeight: 정수;
///uru_Register 지문 등록 기능입니다. 매개변수: 메시지 전송에 사용되는 hwnd 창 핸들, DeviceNo 지문 센서 번호;
///fngCount 지문 등록 횟수 픽셀 지문 이미지 연결 포인터 기능 지문 등록 데이터 포인터.
function uru_Register(hwnd: HWND; DeviceNo, fngCount: 정수; 픽셀: PRegisterPixels; 기능: 포인터): 정수;
///uru_AcquireFeatures 지문 인증 기능입니다. 매개변수: hwnd 창 핸들, 메시지 전송에 사용됨 DeviceNo 지문 센서 번호.
function uru_AcquireFeatures(hwnd: HWND; DeviceNo: 정수; 픽셀, 기능: 포인터): 정수;
///uru_verifyFeatures 지문 비교 기능. 매개변수: srcFeatures는 지문 데이터를 비교해야 합니다. dstFeatures는 지문 데이터를 비교해야 합니다.
함수 uru_verifyFeatures(srcFeatures, dstFeatures: 포인터): Boolean;
///dll 등록 함수
절차 uru_DllRegister;
///특정 지문 센서 이미징 기능을 중단합니다. 매개변수: DeviceNo 지문 센서 번호.
절차 uru_StopGetImage(DeviceNO:Integer);Stdcall;
구현
const
DLLNAME= 'uruShell.dll';
{다음은 uruShell.dll의 내보낸 함수 호출 선언입니다.}
함수 uru_Init; 외부 DLLNAME;
함수 uru_Connect; 외부 DLLNAME;
절차 uru_Terminate; 외부 DLLNAME;
프로시저 uru_AllocFeature; 외부 DLLNAME;
프로시저 uru_FreeFeature; 외부 DLLNAME;
함수 uru_GetImageWidth; 외부 DLLNAME;
함수 uru_GetImageHeight; 외부 DLLNAME;
함수 uru_Register; 외부 DLLNAME;
함수 uru_AcquireFeatures; 외부 DLLNAME;
함수 uru_verifyFeatures; 외부 DLLNAME;
절차 uru_DllRegister; 외부 DLLNAME;
프로시저 uru_StopGetImage;외부 DLLNAME;
끝.
위 작업을 완료한 후 메인 프로젝트 파일에서 Shelluru.pas 파일을 참조한 후 Shelluru.pas 파일에 정의된 함수를 호출할 수 있습니다.
2. 확인된 지문 데이터를 파일이나 데이터베이스에 저장합니다.
위에서 정의한 함수들을 호출하여 지문 등록, 인증, 지문 데이터 저장, 지문 재인증(인식)을 위한 지문인식 시스템을 구현할 수 있습니다. 다음은 지문 등록 및 확인 식별 프로세스의 프로그래밍 구현에 중점을 둡니다.
절차 TForm1.BtnRegisterClick(Sender: TObject) file://지문 등록;
var
i:정수;
시작하다
UserList.Selected = nil인 경우
시작하다
MessageBox(application.Handle, '먼저 사용자를 선택하세요!', nil, MB_OK);
출구;
끝;
UserList.Selected.Data <> nil인 경우
기능 := UserList.Selected.Data 파일://현재 기능이 비어 있습니다.
또 다른
uru_AllocFeature(기능);
if Feature = nil then file://지문 기능이 비어 있는 경우
시작하다
Status.SimpleText := '특징 메모리를 할당할 수 없습니다';
출구;
끝;
for i := 1 ~ 4 do
시작하다
FillChar(픽셀[i]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
이미지[i].새로 고침;
끝;
Status.SimpleText := '등록 시작' + UserList.Selected.Caption + '지문...';
if uru_Register(Handle, DeviceNo, 4, @Pixels, Feature) = FT_OK이면
시작하다
Status.SimpleText := UserList.Selected.Caption + ': 등록 성공!';
UserList.Selected.Data = nil인 경우
UserList.Selected.Data := 기능;
끝
또 다른
시작하다
UserList.Selected.Data = nil이면 uru_FreeFeature(Feature);
Status.SimpleText := UserList.Selected.Caption + ': 등록 실패!';
끝;
끝;
이 함수는 주로 DLL의 uru_Register 함수를 호출하여 사용자의 지문을 등록하는 것입니다. 지문 등록은 지문의 특성 값을 추출하고, 특성 값에 대해 메모리의 한쪽 끝을 할당하여 지문 특성 값 데이터를 저장하고 포인터를 사용하는 것입니다. 나중에 검색할 수 있도록 이 메모리를 가리킵니다. 등록이 완료되면 데이터가 올바른지 확인하기 위해 즉시 검증을 수행해야 합니다. 검증 프로세스는 다음과 같습니다.
절차 TForm1.BtnVerifyClick(발신자: TObject) 파일://검증 지문;
var
기능:포인터;
나는: 정수;
핑거패스: 문자열;
시작하다
Fingerpath:='C:/finger'+Edit9.Text+Edit10.Text;//지문 데이터 저장 경로
UserList.Selected = nil인 경우
시작하다
MessageBox(Application.Handle, '먼저 사용자를 선택하세요!', nil, MB_OK);
출구;
끝;
UserList.Selected.Data = nil인 경우
시작하다
MessageBox(Application.Handle, PChar(Format('%s 사용자는 아직 지문을 등록하지 않았습니다. 먼저 지문을 등록하십시오!', [UserList.Selected.Caption])), nil, MB_OK);
출구;
끝;
FillChar(픽셀[5]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
이미지[5].새로 고침;
Status.SimpleText := '확인 시작' + UserList.Selected.Caption + '지문...';
기능 := UserList.Selected.Data; file://지문 데이터를 비교해야 합니다.
move(Feature^,byt,len); file://길이가 len인 메모리의 세그먼트를 이동하고, Feature부터 시작하는 데이터를 바이트 배열로 이동합니다.
uru_AllocFeature(aFeature);//지문 데이터 주소 할당
if (uru_AcquireFeatures(handle, DeviceNo, Pixels[5], aFeature) = FT_OK) 및 uru_verifyFeatures(@byt, aFeature) then
file://uru_AcquireFeatures지문 인증
file://uru_verifyFeatures지문 비교
시작하다
Status.SimpleText := UserList.Selected.Caption + ': 확인 성공!';
AssignFile(F,fingerpath);//파일 할당
ReWrite(F);//파일을 다시 씁니다.
for i:=0 ~ len do
Write(F,byt[i]);//지문 센서 데이터를 파일에 씁니다.
CloseFile(F);//파일을 닫습니다.
끝
또 다른
Status.SimpleText := UserList.Selected.Caption + ': 확인 실패!';
uru_FreeFeature(aFeature); file://릴리스 메모리
끝;
위 과정의 핵심은 지문 인증이 성공한 후 메모리에 있는 지문 데이터를 즉시 데이터 파일로 저장하는 것입니다. 데이터 파일 이름은 해당 사용자 지문 데이터를 쉽게 찾을 수 있도록 사용자 이름과 숫자를 합한 형식으로 지정하는 것이 좋습니다. 후속 확인 과정에서 발견되었습니다. 마지막으로 임시 할당된 메모리를 해제하는 것을 잊지 마세요. 지문 데이터를 파일에 저장한 다음 파일을 열어 데이터 파일을 검색하고 현재 사용자와 일치하는 프로세스를 수행하여 사용자의 올바른 신원을 확인할 수 있습니다.
절차 TForm1.BitBtn2Click(Sender: TObject) file://이전 사용자 지문 확인
var
aFeature1: 포인터;
나는: 정수;
시작하다
OpenDialog1.Execute이면
시작하다
AssignFile(G,OpenDialog1.FileName);//파일 지정
재설정(G);//파일 재설정
for i:=0 ~ len do
Read(G, byt2[i]);//파일의 지문 센서 데이터를 byte2 배열로 이동합니다.
CloseFile(G);//파일을 닫습니다.
끝;
FillChar(픽셀[5]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
이미지[5].새로 고침;
Status.SimpleText := '확인 시작' + UserList.Selected.Caption + '지문...';
uru_AllocFeature(aFeature1);//지문 데이터 주소 할당
if (uru_AcquireFeatures(handle, DeviceNo, Pixels[5], aFeature1) = FT_OK) 및 uru_verifyFeatures(@byt2, aFeature1) then
Status.SimpleText := UserList.Selected.Caption + ': 확인 성공!'
또 다른
Status.SimpleText := UserList.Selected.Caption + ': 확인 실패!';
uru_FreeFeature(aFeature1); 파일://릴리스 메모리
끝;
실제로 지문 데이터는 데이터베이스에 저장될 수도 있어 다층 구조 시스템을 구현할 수 있습니다. 지문 데이터는 서버의 데이터베이스에 중앙에서 액세스되며, 클라이언트는 필요에 따라 등록 데이터를 서버에 업로드합니다. 이전 사용자가 데이터를 확인해야 할 때 서버에서 이를 읽어 보안을 보장합니다.
4. 요약
U.are.U 2000의 사용법을 소개하는 글입니다. 지문 센서 개발 키트는 지문 데이터 등록, 검증, 데이터 저장 및 오래된 지문의 재검증 프로세스를 구현하기 위한 2차 개발용으로 개발되었습니다. 이 프로세스는 지문을 통해 개인 신원을 식별해야 하는 일부 시스템에서 사용할 수 있습니다. 저자는 이를 바탕으로 공안 기관이나 주거 공동체를 위한 임시 체류 허가 관리 시스템의 프로토타입을 개발했는데, 이는 주로 다음을 실현한다. 사용자의 임시거주허가 관리 기능에 대해서는 지문센서 개발패키지에서 DLL을 호출하는 방법과 2차 개발 시 지문이미지의 연결, 초기화, 표시 등의 핵심과정만을 소개합니다. 지문 장치는 상대적으로 간단하기 때문에 심도 있는 논의가 없기 때문에 dll에서 제공하는 기능을 기반으로 독자가 직접 개발할 수 있습니다. 토론을 위해 저에게 편지를 보내주신 것을 환영합니다. 제 이메일은 [email protected]입니다.