Delphi での指紋センサーの二次開発
1. 指紋センサーの概要
指紋は「最初の物的証拠」という評判があります。指紋に関する科学界の結論は次のとおりです。地球上に 50 億人がいると仮定すると、2 つの同一の指紋が現れるには 300 年かかります。指紋の独自性には反論の余地のない地位があることがわかります。
指紋センサーは、私たちが知るデジタル セキュリティ システムを初めて変革しました。以前は、すべてがパスワードに依存していました。独自のユーザー名を使用してシステムを構成する必要があります。他の人がパスワードを見られないように、キーボードを覆う必要があります。ただし、注意しないと、誰でも簡単にパスワードを盗むことができます。
関連する専門家は次のように予測しています。「指紋認識システムを通じて、私たちは家庭や企業のコンピュータ ユーザーのセキュリティ ニーズを拡大してきました。近い将来、ローカル エリア ネットワーク上であろうとインターネット上であろうと、セキュリティ データの登録やアクセスにおいて、 「もうパスワードは必要ありません。指でタッチするだけです。」
2. 指紋スキャナーの二次開発のご紹介
現在、世界には多くの指紋スキャナーメーカーがあり、その中で最も広く使用されているのが Digitalpersona 社であり、すでにバイオエンジニアリングセキュリティシステムを使用しています。これは、DigitalPersonala の U.are.U 指紋検知セキュリティ システムを HP、Compaq、IBM など向けに製造されたキーボードに統合するという Chicony Electronics との契約に含まれています。
この記事で紹介する指紋センサーの二次開発は、DigitalPersonala の U.are.U 2000 をベースにしています。U.are.U は、you are you (あなたはあなた) の略称です。デバイスは指紋画像を自動的に読み取り、USB インターフェイスを介してデジタル指紋画像をコンピュータに送信できます。これは、ラップトップ、デスクトップ、または認証を必要とするその他の PC デバイスにとって理想的なアクセサリです。
U.are.U 2000 は、低コストでコンパクトな指紋リーダーです。高精度の光学システム、LED 光源、CMOS カメラが統合されており、連携して画像キャプチャ中に電圧制御と自動補正を実行します。また、プラグ アンド プレイ USB インターフェイスを使用して、U.are.U 2000 の指紋スキャン収集を行うように設計されています。 DigitalPersonala U.are.U フィンガープリンティング アルゴリズム、アプリケーション、および DigitalPersonala Universal Authentication Manager (UAM) へのインターフェイス - これらのフィンガープリント関連アプリケーションには Windows が含まれますログイン、画面ロック、パスワードの置換、および暗号化されたディスクドライブ。
指紋センサーのハードウェア製品を購入する場合、販売業者は通常、ハードウェア ドライバー、製品マニュアル、二次開発キット、開発プログラムのサンプルを同梱します。ソフトウェア開発キット (SDK) を通じて、アプリケーションに指紋認識機能を追加できます。
3. 指紋スキャナの二次開発プロセスにおける主要技術
1.dll呼び出し
まずはdelpiで指紋センサー開発キットのdllを呼び出す方法を紹介します。開発パッケージ内の uruShell.dll をプログラム ディレクトリまたはシステム ディレクトリに配置します。わかりやすくするために、DLL 呼び出しステートメントはプログラム ユニット Shelluru.pas に集中されており、そこで uruShell.dll の関数がエクスポートされ、関連する参照ステートメントが作成されます。具体的なソース コードは次のとおりです。
ユニットシェルル。
インタフェース
ウィンドウとメッセージを使用します。
定数
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 は指紋データの長さを返します。
関数 uru_Init(var numOfDev、FeatureLen: 整数): stdcall;
///uru_Connect は特定の指紋センサーに接続します。パラメータ: DeviceNo 指紋センサー番号。
関数 uru_Connect(デバイス番号: 整数): stdcall;
///uru_Terminate は指紋センサーから切断します。パラメータ: DeviceNo 指紋センサー番号。
プロシージャ uru_Terminate(DeviceNo: stdcall);
///uru_AllocFeature は指紋データのアドレスを割り当てます。パラメータ: 機能によって返されるアドレス ポインター。
プロシージャ uru_AllocFeature(var 機能: ポインタ);
///uru_FreeFeature は割り当てられたアドレスを解放します。パラメータ: 機能によって返されるアドレス ポインター。
プロシージャ uru_FreeFeature(var 機能: ポインタ);
///uru_GetImageWidth は指紋画像の幅を取得します。
関数 uru_GetImageWidth: 整数;
///uru_GetImageHeight は指紋画像の高さを取得します。
関数 uru_GetImageHeight: 整数;
///uru_Register 指紋登録関数。パラメータ: hwnd ウィンドウ ハンドル。DeviceNo 指紋センサー番号。
///fngCount 指紋登録回数; ピクセル指紋画像接続ポインタ; 特徴指紋登録データ ポインタ。
関数 uru_Register(hwnd: HWND; DeviceNo, fngCount: 整数; ピクセル: PRegisterPixels; 機能: ポインター): stdcall;
///uru_Acquire特徴指紋認証機能。パラメータ: hwnd ウィンドウ ハンドル。メッセージ送信に使用されます。DeviceNo 指紋センサー番号。
関数 uru_Acquire features(hwnd: HWND; デバイス番号: 整数; ピクセル、機能: ポインタ): stdcall;
///uru_verify特徴指紋照合機能。パラメーター: srcFunctions はフィンガープリント データを比較する必要があります。dstFunctions はフィンガープリント データを比較する必要があります。
関数 uru_verifyFeature(src特徴、dst特徴: ポインタ): stdcall;
///dll登録関数
プロシージャ uru_DllRegister;
///特定の指紋センサーの撮像機能を中断します。パラメータ: DeviceNo 指紋センサー番号。
プロシージャ uru_StopGetImage(DeviceNO:Integer);Stdcall;
実装
定数
DLLNAME= 'uruShell.dll';
{以下はuruShell.dllのexportされた関数の呼び出し宣言です}
関数 uru_Init; 外部 DLLNAME;
関数 uru_Connect 外部 DLLNAME;
プロシージャ uru_Terminate;
プロシージャ uru_AllocFeature; 外部 DLLNAME;
プロシージャ uru_FreeFeature; 外部 DLLNAME;
関数 uru_GetImageWidth; 外部 DLLNAME;
関数 uru_GetImageHeight;
関数 uru_Register; 外部 DLLNAME;
関数 uru_Acquire features 外部 DLLNAME;
関数 uru_verifyFeature; 外部 DLLNAME;
プロシージャ uru_DllRegister; 外部 DLLNAME;
プロシージャ uru_StopGetImage;外部 DLLNAME;
終わり。
上記の作業が完了すると、メイン プロジェクト ファイル内の Shelluru.pas ファイルを参照し、Shelluru.pas ファイルに定義されている関数を呼び出すことができます。
2. 検証された指紋データをファイルまたはデータベースに保存します
上記で定義した関数を呼び出すことで、指紋の登録、照合、指紋データの保存、および指紋の再照合 (認識) を行う指紋認証システムを実装できます。以下では、指紋登録および検証識別プロセスのプログラミング実装に焦点を当てます。
プロシージャ TForm1.BtnRegisterClick(送信者: TObject); file://指紋の登録
変数
i:整数;
始める
UserList.Selected = nil の場合
始める
MessageBox(application.Handle, '最初にユーザーを選択してください!', nil, MB_OK);
出口;
終わり;
if UserList.Selected.Data <> nil then
機能 := UserList.Selected.Data file://現時点では機能は空です
それ以外
uru_AllocFeature(機能);
if Feature = nil then file:// 指紋機能が空の場合
始める
Status.SimpleText := '機能メモリを割り当てられません';
出口;
終わり;
for i := 1 ~ 4 を実行します
始める
FillChar(ピクセル[i]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
画像[i].リフレッシュ;
終わり;
Status.SimpleText := '登録開始' + UserList.Selected.Caption + '指紋...';
if uru_Register(ハンドル、デバイス番号、4、@ピクセル、機能) = FT_OK then
始める
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); file://検証フィンガープリント
変数
機能:ポインタ;
i: 整数;
フィンガーパス: 文字列;
始める
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_Acquire features(handle, DeviceNo, Pixels[5], aFeature) = FT_OK) および uru_verifyFeature(@byt, aFeature) then
file://uru_Acquire features指紋認証
file://uru_verifyFeature指紋の比較
始める
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(送信者: TObject); file://古いユーザーの指紋を確認する
変数
特徴1:ポインタ。
i: 整数;
始める
OpenDialog1.Execute の場合
始める
AssignFile(G,OpenDialog1.FileName);//ファイルを指定
Reset(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_Acquire features(handle, DeviceNo, Pixels[5], aFeature1) = FT_OK) および uru_verifyFeature(@byt2, aFeature1) then
Status.SimpleText := UserList.Selected.Caption + ': 検証成功!'
それ以外
Status.SimpleText := UserList.Selected.Caption + ': 検証に失敗しました!';
uru_FreeFeature(aFeature1); file://解放メモリ
終わり;
実際、指紋データはデータベースに保存することもできるため、クライアントは必要に応じて登録データをサーバーにアップロードして、サーバー上のデータベースに集中的にアクセスすることができます。古いユーザーがデータを検証する必要がある場合、サーバーからデータを読み取り、セキュリティを確保します。
4. まとめ
この記事ではU.are.U 2000の使い方を紹介します。指紋センサーの開発キットは、指紋データの登録、検証、データ保存、古い指紋の再検証のプロセスを実装するための二次開発用に開発されており、このプロセスは指紋を通じて個人の身元を識別する必要がある一部のシステムで使用できます。筆者はこれをベースに、主に以下を実現する公安機関や住宅コミュニティ向けの一時滞在許可管理システムのプロトタイプを開発した。この記事では、ユーザーの一時滞在許可管理機能について、指紋センサー開発パッケージ内の DLL の呼び出し方法と、二次開発における登録と検証の主要なプロセスについてのみ紹介します。指紋デバイスは比較的単純であるため、詳細な説明はありません。DLL が提供する関数に基づいて読者が独自に開発できます。議論するために私に手紙を書くことを歓迎します。私のメールアドレスは [email protected] です。