Tải bản đầy đủ (.doc) (39 trang)

TIểu luận môn CHỨNG THỰC SỐ TÌM HIỂU DỮ LIỆU CSP

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (559.81 KB, 39 trang )

Chương 1:
Giới thiệu chung về CSP
(Cryptographic Service Providers)
CSP là thuật ngữ để chỉ một thành phần trong hệ điều hành Microsoft Windows chứa cài
đặt của các thuật toán và chuẩn mật mã. Một CSP tối thiểu phải có một thư viện dạng liên
kết động (DLL) làm nhiệm vụ hiện thực hóa các hàm trong CryptoSPI (interface giao tiếp
giữa CSP và hệ thống). Hầu hết các CSP tự hiện thực hóa các hàm chức năng của nó. Cũng
có một số CSP sử dụng các dịch vụ của Windows để thực hiện các hàm riêng của mình
dưới sự quản lí của Windows Service Control Manager. Một số CSP khác cài đặt các hàm
này ở mức phần cứng, chẳng hạn như smart-card, pki-token… Nếu một CSP không hiện
thực tất cả các hàm chức năng cần thiết, nó sẽ hoạt động như là một lớp trung gian, đảm
bảo giao tiếp giữa hệ điều hành và chi tiết cài đặt thực sự của các hàm ở lớp bên dưới
(hardware).
1. Tổng quan kiến trúc CSP
Các ứng dụng liên quan tới mật mã chạy trên Windows không giao tiếp trực tiếp với các
CSP mà thông qua việc gọi các hàm trong giao diện CryptoAPI. Các hàm này được cung
cấp trong các thư viện động Advapi32.dll và Crypt32.dll. Sau đó, tới lượt các API này làm
nhiệm vụ tách lọc và chuyển thông tin từ ứng dụng đến CSP thông qua các hàm trong giao
diện CryptoSPI.
1
Các ứng dụng truy xuất data trong CSP thông qua handle của các đối tượng. Mỗi đối tượng
bao gồm key-container, hash-object, session-key và cặp public-private key.
1.1 Giao diện CryptoSPI
Tất cả các CSP phải hỗ trợ các entry-point sau trong DLL của nó:
* CPAcquireContext
Hàm này làm nhiệm vụ lấy handle của key-container được chỉ đến trong tham số
pszContainer.
BOOL CPAcquireContext(
__out HCRYPTPROV *phProv,
__in CHAR *pszContainer,
__in DWORD dwFlags,


__in PVTableProvStruc pVTable
);
* CPCreateHash
Tạo một đối tượng hash và khởi tạo quá trình băm dòng dữ liệu
BOOL CPCreateHash(
__in HCRYPTPROV hProv,
__in ALG_ID Algid,
__in HCRYPTKEY hKey,
__in DWORD dwFlags,
__out HCRYPTHASH *phHash
);
* CPDecrypt
Giải mã dữ liệu đã được mã hoá trước đó bằng hàm CPEncrypt. Có thể tùy chọn để vừa
giải mã vừa băm dữ liệu giải mã được.
BOOL CPDecrypt(
__in HCRYPTPROV hProv,
__in HCRYPTKEY hKey,
__in HCRYPTHASH hHash,
__in BOOL Final,
__in DWORD dwFlags,
__inout BYTE *pbData,
__inout DWORD *pdwDataLen
);
* CPDeriveKey
Tạo ra session-key bằng cách băm dữ liệu nền (password hoặc dữ liệu khác). Hàm này
đảm bảo tất cả các khóa tạo ra từ một dữ liệu nền sử dụng cùng một thuật toán sẽ giống
nhau.
2
BOOL CPDeriveKey(
__in HCRYPTPROV hProv,

__in ALG_ID Algid,
__in HCRYPTHASH hBaseData,
__in DWORD dwFlags,
__out HCRYPTKEY *phKey
);
* CPDestroyHash
Hủy đối tượng hash đã được chỉ ra trong tham số hHash.
BOOL CPDestroyHash(
__in HCRYPTPROV hProv,
__in HCRYPTHASH hHash
);
* CPDestroyKey
Giải phóng handle được chỉ ra trong tham số hKey. Sau khi giải phóng handle của một
khóa, khóa đó sẽ không còn hợp lệ và không sử dụng được nữa.
BOOL CPDestroyKey(
__in HCRYPTPROV hProv,
__in HCRYPTKEY hKey
);
* CPEncrypt
Hàm này làm nhiệm vụ mã hóa dữ liệu. Có thể tùy chọn băm dữ liệu đầu ra.
BOOL CPEncrypt(
__in HCRYPTPROV hProv,
__in HCRYPTKEY hKey,
__in HCRYPTHASH hHash,
__in BOOL Final,
__in DWORD dwFlags,
__inout BYTE *pbData,
__inout DWORD *pdwDataLen,
__in DWORD dwBufLen
);

* CPExportKey
Export một khóa ra ngoài key-container của CSP một cách an toàn.
BOOL CPExportKey(
__in HCRYPTPROV hProv,
__in HCRYPTKEY hKey,
__in HCRYPTKEY hPubKey,
__in DWORD dwBlobType,
__in DWORD dwFlags,
__out BYTE *pbData,
__inout DWORD *pdwDataLen
);

3
* CPGenKey
Tạo một khóa ngẫu nhiên hoặc một cặp khóa bất đối xứng.
BOOL CPGenKey(
__in HCRYPTPROV hProv,
__in ALG_ID Algid,
__in DWORD dwFlags,
__out HCRYPTKEY *phKey
);
* CPGenRandom
Tạo các byte ngẫu nhiên để lấp đầy buffer.
BOOL CPGenRandom(
__in HCRYPTPROV hProv,
__in DWORD dwLen,
__inout BYTE *pbBuffer
);
* CPGetHashParam
Trích xuất dữ liệu từ các đối tượng hash.

BOOL CPGetHashParam(
__in HCRYPTPROV hProv,
__in HCRYPTHASH hHash,
__in DWORD dwParam,
__out BYTE *pbData,
__inout DWORD *pdwDataLen,
__in DWORD dwFlags
);
* CPGetKeyParam
Trích xuất dữ liệu về các tham số của một khóa.
BOOL CPGetKeyParam(
__in HCRYPTPROV hProv,
__in HCRYPTKEY hKey,
__in DWORD dwParam,
__out LPBYTE pbData,
__inout LPDWORD pcbDataLen,
__in DWORD dwFlags
);
* CPGetProvParam
Trả về thông tin của CSP
BOOL CPGetProvParam(
__in HCRYPTPROV hProv,
__in DWORD dwParam,
__out BYTE *pbData,
__inout DWORD *pdwDataLen,
4
__in DWORD dwFlags
);
* CPGetUserKey
Trích xuất hanlde của các cặp khóa chứa trong key-container được chỉ ra trong tham số

hProv.
BOOL CPGetUserKey(
__in HCRYPTPROV hProv,
__in DWORD dwKeySpec,
__out HCRYPTKEY *phUserKey
);
* CPHashData
Cung cấp dữ liệu cho một đối tượng hash.
BOOL CPHashData(
__in HCRYPTPROV hProv,
__in HCRYPTHASH hHash,
__in const BYTE *pbData,
__in DWORD dwDataLen,
__in DWORD dwFlags
);
* CPHashSessionKey
Cung cấp khóa mã cho một đối tượng hash cụ thể. Hàm này cho phép băm một khóa mà
không cần truy cập cụ thể đến chi tiết khóa đó.
BOOL CPHashSessionKey(
__in HCRYPTPROV hProv,
__in HCRYPTHASH hHash,
__in HCRYPTKEY hKey,
__in DWORD dwFlags
);
* CPImportKey
Import một khóa từ bên ngoài CSP.
BOOL CPImportKey(
__in HCRYPTPROV hProv,
__in const BYTE *pbData,
__in DWORD dwDataLen,

__in HCRYPTKEY hPubKey,
__in DWORD dwFlags,
__out HCRYPTKEY *phKey
);
* CPReleaseContext
Giải phóng một context được tạo ra trước đó bởi hàm CPAcquireContext.
BOOL CPReleaseContext(
__in HCRYPTPROV hProv,
5
__in DWORD dwFlags
);
* CPSetHashParam
Tùy chỉnh hoạt động của một đối tượng hash.
BOOL CPSetHashParam(
__in HCRYPTPROV hProv,
__in HCRYPTHASH hHash,
__in DWORD dwParam,
__in BYTE *pbData,
__in DWORD dwFlags
);
* CPSetKeyParam
Tùy chỉnh hoạt động của một khóa.
BOOL CPSetKeyParam(
__in HCRYPTPROV hProv,
__in HCRYPTKEY hKey,
__in DWORD dwParam,
__in BYTE *pbData,
__in DWORD dwFlags
);
* CPSetProvParam

Tùy chỉnh hoạt động của CSP.
BOOL CPSetProvParam(
__in HCRYPTPROV hProv,
__in DWORD dwParam,
__in BYTE *pbData,
__in DWORD dwFlags
);
* CPSignHash
Kí một đối tượng hash.
BOOL CPSignHash(
__in HCRYPTPROV hProv,
__in HCRYPTHASH hHash,
__in DWORD dwKeySpec,
__in LPCWSTR sDescription,
__in DWORD dwFlags,
__out BYTE *pbSignature,
__inout DWORD *pdwSigLen
);
* CPVerifySignature
Kiểm chứng một chữ kí điện tử.
6
BOOL CPVerifySignature(
__in HCRYPTPROV hProv,
__in HCRYPTHASH hHash,
__in const BYTE *pbSignature,
__in DWORD dwSigLen,
__in HCRYPTKEY hPubKey,
__in LPCWSTR sDescription,
__in DWORD dwFlags
);

Các hàm trên hợp thành giao diện giao tiếp CryptoSPI giữa system-layer và CSP-layer.
Mỗi hàm tương ứng trực tiếp với một hàm trong giao diện CryptoAPI.
Các đối tượng bền vững (persistent data objects)
Một CSP có thể lưu các cặp khóa pb/pr để sử dụng cho nhiều session trong một bộ nhớ bền
vững. Nếu là dạng thuần software CSP thì có thể lưu trữ dưới dạng mã hóa trong registry.
Nếu CSP có chứa thành phần hardware khác thì có thể lưu trữ trong các bộ nhớ được bảo
vệ của hardware đó.
Các cặp khóa được lưu dưới dạng đối tượng logic gọi là key-container. CSP sẽ quản lí mỗi
key-container cho một client sử dụng CSP đó. Mỗi key-container có thể chứa nhiều cặp
khóa tương ứng với từng loại mà CSP hỗ trợ. Chẳng hạn Microsoft Base Cryptographic
Provider hỗ trợ 2 loại cặp khóa: lọai cặp dùng để trao đổi khóa (key exchange key pair) và
loại cặp dùng để tạo chữ kí (digital signature key pair).
Tại một thời điểm, mỗi key-container có thể được sử dụng bởi nhiều chương trình ứng
dụng. Mỗi lời gọi tới một hàm trong CryptoSPI đều chỉ ra các tham số áp dụng cho key-
container trong hàm đó, như thể hiện trong sơ đồ dưới:
Đối với giao diện CryptoSPI, HCRYPTPROV là handle của một key-container cụ thể
trong CSP. Tuy nhiên, đối với giao diện CryptoAPI, HCRYPTPROV là handle cho cả key-
container và cả CSP đang được sử dụng.
7
Các đối tượng không bền vững (volatile data objects)
Một CSP quản lí các đối tượng session-key và hash-object trong bộ nhớ không bền vững.
Các đối tượng này được tạo bởi hàm CPGenKey và CPCreateHash, được hủy bởi các hàm
CPDestroyKey và CPDestroyHash. Các đối tượng trên phải được hủy khi key-container
tương ứng được hủy thông qua hàm CPReleaseContext.
Các đối tượng trong bộ nhớ không bền vững được truy cập thông qua các handle như hình
dưới:
1.2 Các loại Cryptographic Provider
Ngày càng có nhiều chuẩn mã hóa dữ liệu cũng như các giao thức giao tiếp khác nhau.
Chúng được phân loại thành các nhóm, mỗi nhóm có đặc tính riêng về cách tổ chức định
dạng dữ liệu và cách tiến hành các thuật toán. Thậm chí nếu hai nhóm dùng chung một

thuật toán mật mã, vẫn có những điểm riêng khác biệt trong cách padding, chiều dài
khóa… của thuật toán đó. Giao diện CryptoAPI được thiết kế sao cho mỗi CSP được gán
một kiểu để thể hiện nhóm thuật toán mà nó sử dụng. Khi một ứng dụng kết nối tới một
CSP thuộc một kiểu cụ thể, mỗi hàm trong giao diện CryptoAPI sẽ hoạt động theo cách
thức định trước bởi kiểu CSP đó. Mỗi kiểu CSP có các đặc trưng sau:
Item Description
Key exchange
algorithm
Mỗi kiểu CSP cần định nghĩa và hiện thực hóa duy nhất một thuật
toán trao đổi khóa.
Digital signature
algorithm
Mỗi kiểu CSP cần định nghĩa và hiện thực hóa duy nhất một thuật
toán phát sinh chữ kí số.
Key BLOB formats Định dạng để export và import các khóa từ bên ngoài CSP.
Digital signature
format
Định dạng của chữ kí số. Một chữ kí phát sinh từ một CSP luôn có
thể kiểm chứng được bởi một CSP cùng loại.
Session key
derivation scheme
Định dạng trích xuất session-key từ mã hash.
Key length Độ dài của cặp khóa pb/pr cũng như session-key.
Default modes Các chế độ mặc định cho các thuật toán mã hóa/giải mã.
8
Chỉ một vài ứng dụng cao cấp có thể yêu cầu kết nối tới nhiều CSP tại một thời điểm, hầu
hết các ứng dụng thường chỉ sử dụng một CSP.
Có các loại CSP thông dụng được định nghĩa trước như sau:
* PROV_RSA_FULL
Cung cấp cả cơ chế chữ kí số cũng như mã hóa dữ liệu, có thể sử dụng cho tất cả hoạt

động khóa công khai.
Key Exchange RSA
Signature RSA
Encryption RC2, RC4
Hashing MD5, SHA
* PROV_RSA_AES
Cung cấp cả cơ chế chữ kí số cũng như mã hóa dữ liệu, có thể sử dụng cho tất cả hoạt
động khóa công khai.
Key Exchange RSA
Signature RSA
Encryption RC2, RC4, Advanced Encryption Standard (AES)
Hashing MD2, MD4, MD5, SHA-1, SHA-2 (SHA-256, SHA-384, SHA-512)
* PROV_RSA_SIG
Tập con của PROV_RSA_FULL, chỉ hỗ trợ các thuật toán băm và chữ kí điện tử
Key Exchange None
Signature RSA
Encryption None
Hashing MD5, SHA
* PROV_RSA_SCHANNEL
Hỗ trợ cả thuật toán RSA và Schannel
Key Exchange RSA
Signature RSA
Encryption Một trong số: RC4, DES, Triple DES
Hashing MD5, SHA
* PROV_DSS
Chỉ hỗ trợ băm và chữ kí điện tử
Key Exchange None
Signature DSS
Encryption None
Hashing MD5, SHA

9

* PROV_DSS_DH
Mở rộng của PROV_DSS
Key Exchange DH
Signature DSS
Encryption CYLINK_MEK
Hashing MD5, SHA
* PROV_DH_SCHANNEL
Hỗ trợ cả thuật toán Diffie-Hellman và Schannel
Key Exchange DH (ephemeral)
Signature DSS
Encryption DES, Triple DES
Hashing MD5, SHA
* PROV_FORTEZZA
Cung cấp các thuật toán thuộc về NIST
Key Exchange KEA
Signature DSS
Encryption Skipjack
Hashing SHA
* PROV_MS_EXCHANGE
Được thiết kế cho các hoạt động mật mã cần thiết cho ứng dụng thư điện tử Microsoft
Echange và sản phẩm tương thích khác.
Key Exchange RSA
Signature RSA
Encryption CAST
Hashing MD5
* PROV_SSL
Hỗ trợ cho giao thức SSL
Key Exchange RSA

Signature RSA
Encryption Tùy thuộc
Hashing Tùy thuộc
Ngoài ra, các nhà phát triển CSP có thể tự định nghĩa kiểu cho riêng mình.
10
1.3 Các CSP được cung cấp bởi Microsoft
Hiện tại Microsoft cung cấp các CSP sau:
Provider Description
Microsoft Base Cryptographic
Provider
Cung cấp các hàm chức năng mật mã cơ bản.
Microsoft Strong Cryptographic
Provider
Phiên bản mở rộng, áp dụng từ Windows 2000.
Microsoft Enhanced Cryptographic
Provider
Áp dụng chiều dài khóa lớn hơn, bổ sung thêm một
số thuật toán.
Microsoft AES Cryptographic
Provider
Mở rộng của bản Enhanced, hỗ trợ thuật toán mã
hóa AES.
Microsoft DSS Cryptographic
Provider
Cung cấp cơ chế băm, kí và kiểm chứng chữ kí sử
dụng chuẩn SHA và DSS.
Microsoft Base DSS and Diffie-
Hellman Cryptographic Provider
Bản mở rộng của DSS, hỗ trợ thuật toán trao đổi
khóa Dfiie-Hellman.

Microsoft Enhanced DSS and Diffie-
Hellman Cryptographic Provider
Mở rộng của bản trên, hỗ trợ DSS 40-bit.
Microsoft DSS and Diffie-
Hellman/Schannel Cryptographic
Provider
Hỗ trợ hashing, data signing với DSS, tạo khóa
Diffie-Hellman (D-H), trao đổi khóa D-H, export
khóa D-H. Hỗ trợ SSL3 và TSL1.
Microsoft RSA/Schannel
Cryptographic Provider
Hỗ trợ xác thực client.
Microsoft RSA Signature
Cryptographic Provider
Cung cấp cơ chế kí và kiểm chứng chữ kí chuẩn
RSA.
1.4 Cơ chế tương thích giữa các CSP
Để có thể cùng hoạt động một cách tương thích với các CSP khác, một CSP thuộc kiểu
PROV_RSA_FULL phải đảm bảo các yêu cầu cài đặt cụ thể. Các CSP kiểu
PROV_RSA_SIG (lớp con của RSA_FULL) không nhất thiết phải áp dụng tất cả các yêu
cầu trên.
Các điểm quan trọng để đảm bảo tương thích được liệt kê ở bảng sau:
Major requirement Description
Supported algorithms Tập các thuật toán mã hoá / giải mã tối thiểu mà CSP phải hỗ trợ.
11
Key BLOB formats Chuẩn định dạng cho phép export / import key bên ngòai CSP.
Deriving session keys
Với cùng giá trị hash, các CSP phải đảm bảo trích xuất được cùng
một session-key.
Hashing session keys

Cho trước một key, các CSP phải đảm bảo hash ra được cùng một
giá trị.
Digital signature
mechanics
Các CSP phải có cùng cơ chế phát sinh chữ kí điện tử để có thể
kiểm chứng lẫn nhau.
1.5 Quá trình viết các CSP
Trước khi viết CSP cụ thể, nhà phát triển phải chọn trước và hiện thực hóa các thuật toán
mã hoá cũng như định dạng dữ liệu sẽ được đưa vào. Quá trình phát triển một CSP bao
gồm các bước như sau:
1/ Tạo thư viện động (DLL ) hiện thực các hàm.
Quá trình tạo các dll được thực hiện bởi CSP developer’s toolkit. Với các CSP có chứa
thành phần hardware, trong dll phải chứa driver để điều khiển thành phần này. Trong dll
cần hiện thực các hàm của giao diện CryptoSPI đã nói ở phần trước.
2/ Viết chương trình cài đặt CSP.
Chương trình này làm nhiệm vụ sao chép dll vào thư mục cụ thể (trỏ tới bởi biến môi
trường PATH), cũng như tạo các khóa cần thiết trong registry.
3/ Kiểm chứng hoạt động của CSP
4/ Kí CSP
Một CSP phải được kí bởi Microsoft để có thể sử dụng được trong các hệ điều hành
Windows
5/ Kiểm tra lại hoạt động của CSP sau khi được kí
12
Chương 2:
Smart Card CSP
Một trường hợp đặc biệt và khá thông dụng của CSP đó là Smart Card CSP. Đó là sự kết
hợp giữa các lớp middle-ware và hardware để phục vụ nhu cầu kí, giao dịch an toàn và các
dịch vụ mật mã khác.
2.1 Tổng quan về Smart Card CSP
Smart Card thường có hai dạng, có thể dưới dạng các thẻ plastic, có thể dưới dạng USB

token, chứa các bộ xử lí có khả năng lưu trữ và xử lí thông tin một cách an toàn. Trên môi
trường Windows, các thẻ tương thích chuẩn PC/SC có thể được sử dụng trực tiếp, các loại
thẻ khác cần được nhà sản xuất cung cấp các phương pháp thích hợp để truy xuất thẻ.
Lợi ích chính của các smart card là lưu trữ các cặp khóa pb/pr để sử dụng trong các thuật
toán mật mã bất đối xứng. Các hoạt động yêu cầu khóa pr có thể được thực hiện ngay trên
thẻ đển đảm bảo an toàn. Do tính gọn nhẹ mà smart card có thể sử dụng trong các giao dịch
ở bất kì đâu, không phụ thuộc vào máy chủ. Với cơ chế bảo vệ mã PIN, smart card có thể
cung cấp các cơ chế xác thực 2 lớp mạnh mẽ. Do đó, chúng thường được dùng trong các
hoạt động như xác thực đăng nhập, tạo và kiểm chứng chữ kí điện tử, mã hóa/giải mã dữ
liệu.
Microsoft cung cấp 2 API độc lập thiết bị để có thể sử dụng các tính năng của smart card,
đó là CryptoAPI và Win32 SCard API. Các giao diện này cho phép ứng dụng có thể truy
cập tính năng mã hóa hoặc phát sinh chữ kí của thẻ một cách linh hoạt, đồng thời bảo vệ
các dữ liệu nhạy cảm của người dùng như khóa pr. Tất cả các hoạt động mật mã đều được
thực hiện bởi các module độc lập là các CSP.
13
Hạ tầng lớp dưới của smart card bao gồm các lớp cung cấp dịch vụ, một trình quản lí tài
nguyên, các driver của thiết bị, và thư viện truy cập thẻ.
Một ứng dụng Win32 có thể truy cập trực tiếp một số dịch vụ của thẻ thông qua SCard
API. Tuy nhiên, các dịch vụ mật mã của thẻ đòi hỏi ứng dụng phải thông qua CSP.
Trình quản lí tài nguyên (resource manager) chịu trách nhiệm quản lí và điều khiển quá
trình truy cập thẻ của tất cả các ứng dụng, cấp phát và thu hồi tài nguyên thẻ cũng như đầu
đọc thẻ cho các ứng dụng. Ngoài ra, chương trình này còn hỗ trợ transaction (các chuỗi
hoạt động với tính năng đặc biệt, hoặc là được thực hiện hết, hoặc là hoàn toàn không thực
hiện) để đảm bảo tòan vẹn dữ liệu trên thẻ.
Driver của từng thiết bị ánh xạ các hàm chức năng của thiết bị đó vào các dịch vụ được
cung cấp bởi hệ điều hành.
Các chi tiết chung của CSP đã được trình bày ở phần trước, ở đây chỉ nêu các điểm đặc thù
của CSP có chứa thành phần phần cứng.
Trước hết là các điểm khác biệt giữa hardware và software CSP

CryptoAPI Flag Hardware CSP Software CSP
CryptAcquireContext CRYPT_SILENCE
Tắt tất cả các giao
tiếp UI với thẻ, kể
cả các UI để nhập
PIN
Tắt các UI đang yêu
cầu xác nhận
password bảo vệ
khóa
CryptAcquireContext CRYPT_MACHINE_KEY_SET
Không cache bất
cứ thông tin nào
thông qua handle
trả về của hàm
Tạo các khóa có thể
chia sẽ bởi nhiều
người trên cùng một
máy. Không lưu trữ
khóa trong user
14
profile
CryptAcquireContext CRYPT_VERIFYCONTEXT
Chỉ cho phép CSP
truy cập dữ liệu
công cộng trên
hardware
Cho phép hoạt động
truy cập bất kì
CryptExportKey

CryptImportKey
PRIVATEKEYBLOB
PLAINTEXTKEYBLOB
Không được hỗ
trợ. Không được
phép chuyển các
khóa pr ra ngoài
hardware
Được cho phép xuất
các khóa ra bên ngoài
để sử dụng ở nơi
khác
Cả hardware và software CSP đều chỉ cho phép chứa một khóa của mỗi loại trong một key-
container. Hai loại khóa mặc định là khóa để tạo chữ kí và khóa để trao đổi khóa. Khi thêm
một khóa mới vào key-container, khóa cũ cùng loại nếu có sẽ bị ghi đè. Do giới hạn khả
năng lưu trữ của hardware nên smart card CSP chỉ có thể tạo một số lượng giới hạn các cặp
khóa cũng như key-container, đồng thời, mỗi khóa chỉ có thể tương ứng với một certificate.
Software CSP không bị giới hạn này.
Các mã lỗi của software CSP đã được quy chuẩn rõ ràng, thuận tiện cho phát triển. Ngược
lại, các mã lỗi của hardware CSP phụ thuộc nhiều vào nhà sản xuất, do đó rất khác nhau.
2.2 PIN caching
Khi một ứng dụng yêu cầu truy cập tới khóa pr hoặc các chứng thực cá nhân khác của
người sử dụng, trước tiên nó cần xác thực được người đang yêu cầu ứng dụng đó. Điều này
được thực hiện qua cơ chế yêu cầu mã PIN. Sau khi người dùng cung cấp mã PIN hợp lệ,
ứng dụng có thể truy cập tới các dữ liệu nhạy cảm trên thẻ.
Chẳng hạn, một chương trình email có thể yêu cầu người dùng xác thực mã PIN, sau đó sử
dụng khóa pr trong thẻ để kí vào nội dung của một thông điệp. Tuy nhiên, vẫn có khả năng
khi user vẫn còn được chứng thực (do một chương trình hợp lệ yêu cầu mã PIN trước đó)
và bị một chương trình khác lợi dụng để truy cập vào các dữ liệu trên thẻ. Để ngăn chặn
điều đó, các smart card cung cấp cơ chế transaction. Điều này cho phép thẻ “quên” xác

thực mã PIN của người dùng sau mỗi phiên giao dịch. Tuy nhiên, điều này lại gây phiền
toái cho người sử dụng khi phải nhập PIN liên tục cho mỗi lần giao dịch. Do đó, người
phát triển CSP phải cung cấp cơ chế lưu trữ PIN tạm thời một cách an toàn (PIN caching).
PIN sẽ được lưu trữ trong bộ nhớ của CSP, tương ứng cho từng process, đồng thời gắn với
Logon ID của người dùng. Mỗi thẻ cũng sẽ có một vùng cache riêng, CSP sẽ xác định
process nào trong cache của thẻ nào trong phiên làm việc của user nào có mã PIN hợp lệ.
CSP có thể lấy PIN từ người dùng (thông qua PIN UI) hoặc từ ứng dụng (thông qua hàm
CryptSetProvParam PP_KEYEXCHANGE). Sau đó, mã này được đưa xuống thẻ để xác
15
thực, đồng thời được cập nhật vào cache để đảm bảo đồng bộ hóa. CSP phải xóa bỏ cache
khi process kết thúc, khi người dùng thoát, hoặc khi thẻ được gỡ khỏi máy.
Hai hình dưới là quá trình PIN caching tương ứng với hai trường hợp lấy mã từ user đã đề
cập ở trên:
16
2.3 Một số quá trình xác thực thông dụng
Phần này trình bày các bước gọi hàm cũng như các tham số và flag được sử dụng trong các
quá trình thường gặp với thẻ.
Windows XP interactive logon
1. CryptAcquireContext
Lấy handle chỉ tới key-container mặc định, sử dụng 2 flag CRYPT_MACHINE_KEYSET
và CRYPT_SILENT
2. CryptGetUserKey
Lấy handle chỉ tới khóa trao đổi khóa của người dùng
3. CryptGetKeyParam
17
Lấy thông số kích thước của certificate (byte)
4. CryptGetKeyParam
Đọc certificate từ thẻ vào buffer
5. CryptGetProvParam
Sử dụng cờ PP_CONTAINER để lấy kích cỡ của tên của key-container hiện tại

6. CryptGetProvParam
Lấy tên của key-container hiện tại
7. CryptGetProvParam
Sử dụng cờ PP_NAME để lấy độ dài tên của CSP
8. CryptGetProvParam
Lấy tên của CSP
9. CryptDestroyKey
Giải phóng handle chỉ tới key-container đã lấy trước đó
10. CryptAcquireContext
Lấy handle chỉ tới key-container mặc định, sử dụng 2 flag CRYPT_MACHINE_KEYSET
và CRYPT_SILENT
11. CryptGetProvParam
Sử dụng tham số PP_ENUMALGS và cờ CRYPT_FIRST để lấy thông tin về thuật toán
đầu tiên mà thẻ hỗ trợ
Lặp lại bước này cho tới khi lấy hết thông tin của tất cả thuật toán
12. CryptSetProvParam
Chuyển mã PIN cho thẻ
13. CryptCreateHash
Lấy handle chỉ tới một đối tượng hash sử dụng MD5
14. CryptHashData
Băm dữ liệu đầu vào
15. CryptSignHash
Kí vào dữ liệu đã băm
16. CryptSetProvParam
Chuyển mã PIN cho thẻ
17. CryptCreateHash
Lấy handle chỉ tới một đối tượng hash sử dụng MD5
18. CryptHashData
Băm dữ liệu đầu vào
18

19. CryptGetHashParam
Sử dụng tham số HP_HASHVAL để lấy kích thước của mã hash
20. CryptGetHashParam
Lấy giá trị đã băm
21. CryptCreateHash
Lấy handle chỉ tới một đối tượng hash sử dụng MD5
22. CryptSetHashParam
Sử dụng tham số HP_HASHVAL, không có dữ liệu vào
23. CryptSignHash
Lấy kích thước của chữ kí đã phát sinh
24. CryptSignHash
Lấy về mã băm đã được kí
25. CryptDestroyHash
Giải phóng đối tượng hash 1
26. CryptDestroyHash
Giải phóng đối tượng hash 2
27. CryptSetProvParam
Chuyển mã PIN cho thẻ
28. CryptSetProvParam
Chuyển mã PIN cho thẻ
29. CryptGetUserKey
Lấy handle chỉ tới khóa trao đổi khóa trong key-container mặc định
30. CryptImportKey
Import khóa từ bên ngoài
31. CryptSetKeyParam
Khởi tạo vector, cho tất cả giá trị về 0
32. CryptDecrypt
Giải mã đoạn dữ liệu với khóa đã import trước đó
33. CryptDestroyKey
Giải phóng khóa được import

34. CryptGenRandom
Tạo 32 byte ngẫu nhiên
35. CryptCreateHash
Lấy handle chỉ tới một đối tượng hash sử dụng SHA
36. CryptHashData
Băm dữ liệu đầu vào
19
37. CryptSetKeyParam
Khởi tạo vector, cho tất cả giá trị về 0
38. CryptSignHash
Lấy kích thước của chữ kí đã phát sinh
39. CryptSignHash
Lấy về mã băm đã được kí
40. CryptDestroyHash
Giải phóng đối tượng hash
41. CryptCreateHash
Lấy handle chỉ tới một đối tượng hash sử dụng SHA
42. CryptHashData
Băm dữ liệu đầu vào
43. CryptSetKeyParam
Khởi tạo vector, cho tất cả giá trị về 0
44. CryptSignHash
Lấy kích thước của chữ kí đã phát sinh
45. CryptSignHash
Lấy về mã băm đã được kí
46. CryptDestroyHash
Giải phóng đối tượng hash
47. CryptAcquireContext
Sử dụng cờ CRYPT_SILENT, lấy về handle chỉ tới key-container mặc định
48. CryptGetProvParam

Sử dụng cờ PP_CONTAINER để lấy kích cỡ của tên của key-container hiện tại
49. CryptGetProvParam
Lấy tên của key-container hiện tại
50. CryptGetUserKey
Lấy handle chỉ tới khóa trao đổi khóa trong key-container mặc định
51. CryptGetKeyParam
Lấy thông số kích thước của certificate (byte)
52. CryptGetKeyParam
Đọc certificate từ thẻ vào buffer
53. CryptDestroyKey
Giải phóng handle chỉ tới khóa trao đổi khóa trước đó
54. CryptGetUserKey
Lấy handle chỉ tới khóa phát sinh chữ kí trong key-container mặc định
20
55. CryptReleaseContext
Giải phóng handle chỉ tới key-container mặc định
Kí thư điện tử
Quá trình tạo chữ kí điện tử cho email trong Windows XP có các bước như sau:
1. CryptAcquireContext
Lấy handle chỉ đến key-container mặc định trên hardware
2. CryptCreateHash
Lấy handle chỉ đến một đối tượng hàm băm SHA
3. CryptHashData
Băm dữ liệu đã được đưa vào
4. CryptGetHashParam
Lấy kích cỡ mã băm, sử dụng tham số HP_HASHVAL
5. CryptGetHashParam
Lấy dữ liệu sau khi băm
6. CryptHashData
Tiếp tục băm dữ liệu đầu vào

7. CryptSignHash
Lấy kích cỡ chữ kí
8. CryptSignHash
Kí vào chuỗi dữ liệu đã băm, trả về dữ liệu đã kí
9. CryptDestroyHash
Giải phóng handle của đối tượng hash
10. CryptReleaseContext
Giải phóng handle của defaul key-container
Xác thực người dùng
Quá trình này trong Windows XP trải qua các bước sau:
1. CryptAcquireContext
Lấy handle chỉ đến key-container mặc định trên hardware
2. CryptCreateHash
Lấy handle chỉ đến một đối tượng hàm băm SHA
3. CryptSetHashParam
Sử dụng tham số HP_HASHVAL, không có dữ liệu vào
4. CryptSignHash
21
Lấy kích cỡ chữ kí
5. CryptSignHash
Kí vào chuỗi dữ liệu đã băm, trả về dữ liệu đã kí
6. CryptDestroyHash
Giải phóng handle của đối tượng hash
22
Chương 3:
Smartcard minidriver based on CSP
3.1 Giới thiệu
Bắt đầu từ Windows Vista, Microsoft đã đơn giản hóa quá trình phát triển CSP cho các
thiết bị PKI token (Smartcard, usb key…) bằng cách phân chia CSP truyền thống thành 2
phần: Base CSP (phần chung, đi kèm hệ điều hành) và Smartcard minidriver (phần riêng,

do nhà cung cấp phát triển).
Base CSP là lớp chung, sẽ chịu trách nhiệm giao tiếp với lớp trên, quản lí các tác vụ thông
dụng như PIN cache, PIN entry, hash, mã hóa đối xứng, mã hóa khóa công cộng …
Các minidriver tương ứng với các nhà cung cấp thẻ sẽ chịu trách nhiệm quản lí các tác vụ
gắn liền với thẻ thông qua giao tiếp với lớp SCRM (smartcard resource manager) ở dưới
nhằm mục đích trừu tượng hóa các giao tiếp đặc thù của từng loại thẻ sao cho khớp với
Base CSP. Các ứng dụng liên quan tới thẻ có thể dùng CryptoAPI: Next Generation
(CNG) hoặc Key Storage Provider (KSP) để giao tiếp với các lớp bên dưới. Sơ đồ tổng
quát của hệ thống, tương ứng với các ứng dụng dùng CAPI và CAPI2 như sau:
23
3.2 Hiện thực hóa minidriver:
3.2.1 Tổng quan:
Smartcard minidriver là lớp giao diện thấp nhất trong hệ thống, giúp cho Base CSP/KSP có
thể tương tác với các loại thẻ khác nhau thông qua SCRM. Minidriver được hiện thực dưới
dạng một dll hỗ trợ các API được đề cập trong spec của Microsoft. Mỗi lời gọi tới các hàm
trong minidriver đều đi kèm tham số là một con trỏ kiểu CARD_DATA, cung cấp thông
tin về ngữ cảnh cụ thể khi giao tiếp như trạng thái kết nối, bảng con trỏ hàm… Thông số
này sẽ được gán giá trị cụ thể bởi minidriver khi lớp trên gọi tới hàm CardAcquireContext.
Mỗi hoạt động gắn với card (như là kiểm tra PIN, giải mã, kí…) được khuyến khích tiến
hành dưới dạng các atomic transaction (các chuỗi hoạt động có đặc điểm chỉ được thực
hiện tất cả, hoặc không thực hiện hoạt động nào) nhằm đảm bảo toàn vẹn dữ liệu trên thẻ.
24
3.2.2 Cấp phát bộ nhớ:
Mọi API trong minidriver nếu cần cấp phát động bộ nhớ động thì phải sử dụng hàm
PFN_CSP_ALLOC, và tương ứng là PFN_CSP_FREE để giải phóng.
3.2.3 Cache:
Lớp Card Interface trong Base CSP/KSP hiện thực một cache để giảm thiểu lượng data
ghi/đọc xuống thẻ. Minidriver có thể sử dụng các cache này thông qua các con trỏ hàm để
tăng hiệu quả hoạt động.
3.2.4 Version checking:

Minidriver phải đảm bảo kiểm tra tính phù hợp về version giữa các cấu trúc được gửi từ
lớp trên và các cấu trúc khai báo nội tại.
3.2.5 Cơ chế đăng kí và import:
Các hoạt động này được gọi bởi ứng dụng quản lí thẻ cũng như Base CSP/KSP.
3.2.5.1 DllMain và cơ chế đăng kí
DllMain là hàm chịu trách nhiệm thực hiện khi driver được load/unload và attach/detach để
quản lí trạng thái và cấp phát tài nguyên.
BOOL WINAPI DllMain(
__in HANDLE hinstDLL,
__in DWORD dwReason,
__in LPVOID lpvReserved
);
Cơ chế đăng kí driver với hệ thống được thực hiện thông qua một file inf. File này sẽ tạo
các khóa trong registry cũng như copy các file cần thiết vào đúng vị trí. Thông thường
registry sẽ được thêm các entry chứa thông tin về tên file driver cũng như ATR, ATRmask,
ví dụ:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\VENDORCARDNAME]
"80000001"="VENDOR.dll"
"ATR"=hex:01,23,45,67,89,01,23,45,67,89,01,23,45,67,89,01,23,45
"ATRMask"=hex:ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff
3.2.5.2 Cơ chế import các API từ lớp trên (Base CSP/KSP)
Khi Base CSP/KSP gọi hàm CardAcquireContext của minidriver, nó truyền vào một struct
chứa các con trỏ hàm để gọi đến các hàm của lớp trên. Các hàm này cung cấp cơ chế quản
lí bộ nhớ (cấp phát, giải phóng…) cũng như một số hàm crypto (pad, unpad…). Nhờ đó,
25

×