Bài giảng Lập trình an toàn - Chương 5: Hàm băm và xác thực thông điệp - Lương Ánh Hoàng

Hàm băm (hashes)

- Nhận đầu vào là một xâu và đầu ra là một chuỗi bit có chiều dài xác định.

- Tỉ lệ đụng độ rất nhỏ.

- Dùng để kiểm tra tính toàn vẹn của dữ liệu nhưng không đảm bảo tính xác thực của dữ liệu.

- Thường kết hợp với mô hình mã hóa công khai chứ không sử dụng một mình.

- Các giải thuật băm thông dụng: MD5, SHA1 

Xác thực thông điệp (Message Authentication Code)

- Nhận đầu vào là một xâu và một khóa bí mật, đầu ra là một mã có chiều dài xác định.

- Dùng để kiểm tra tính toàn vẹn và xác thực của dữ liệu.

- Các giải thuật thông dụng: OMAC, CMAC, HMAC

 

docx 20 trang kimcuc 5080
Bạn đang xem tài liệu "Bài giảng Lập trình an toàn - Chương 5: Hàm băm và xác thực thông điệp - Lương Ánh Hoàng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình an toàn - Chương 5: Hàm băm và xác thực thông điệp - Lương Ánh Hoàng

Bài giảng Lập trình an toàn - Chương 5: Hàm băm và xác thực thông điệp - Lương Ánh Hoàng
Chương 5. Hàm băm và xác thực thông điệp Hashes and Message Authentication Lương Ánh Hoàng hoangla@soict.hut.edu.vn
Nội dung
Các loại hàm băm và MAC thông dụng
Băm với OpenSSL
Băm dữ liệu với CryptoAPI
Xác thực thông điệp với HMAC
Salt
Hàm băm (hashes)
Nhận đầu vào là một xâu và đầu ra là một chuỗi bit có chiều dài xác định.
Tỉ lệ đụng độ rất nhỏ.
Dùng để kiểm tra tính toàn vẹn của dữ liệu nhưng không đảm bảo tính xác thực của dữ liệu.
Thường kết hợp với mô hình mã hóa công khai chứ không sử dụng một mình.
Các giải thuật băm thông dụng: MD5, SHA1
• Hàm băm (hashes)
Algorithm
Digest size
Security confidence
Small message speed (64 bytes), in cycles per byte 9
Large message speed (8K), in cycles per byte
Uses block cipher
Davies-Meyer-
AES-128
128 bits (same length as cipher block size)
Good
46.7 cpb
57.8 cpb
Yes
MD2
128 bits
Good to low
392 cpb
184 cpb
No
MD4
128 bits
Insecure
32 cpb
5.8 cpb
No
MD5
128 bits
Very low, may be insecure
40.9 cpb
7.7 cpb
No
MDC-2-AES-128
256 bits
Very high
93 cpb
116 cpb
Yes
MDC-2-DES
128 bits
Good
444 cpb
444 cpb
Yes
RIPEMD-160
160 bits
High
62.2 cpb
20.6 cpb
No
SHA1
160 bits
High
53 cpb
15.9 cpb
No
SHA-256
256 bits
Very high
119 cpb
116 cpb
No
SHA-384
384 bits
Very high
171cpb
166 cpb
No
SHA-512
512 bits
Very high
171cpb
166 cpb
No
Xác thực thông điệp (Message Authentication Code)
Nhận đầu vào là một xâu và một khóa bí mật, đầu ra là một mã có chiều dài xác định.
Dùng để kiểm tra tính toàn vẹn và xác thực của dữ liệu.
Các giải thuật thông dụng: OMAC, CMAC, HMAC
Xác thực thông điệp (Message Authentication Code)
MAC
Built upon
Small message speed (64 bytes) 4]
Large message speed (8K)
Appropriate for hardware
Patent restrictions
Parallel-izable
CMAC
A universal hash and AES
~18 cpb
~18 cpb
Yes
No
Yes
HMAC-SHA1
Message digest function
90 cpb
20 cpb
Yes
No
No
MAC127
hash127 + AES
~6 cpb
~6 cpb
Yes
No
Yes
OMAC1
AES
29.5 cpb
37 cpb
Yes
No
No
OMAC2
AES
29.5 cpb
37 cpb
Yes
No
No
PMAC-AES
Block cipher
72 cpb
70 cpb
Yes
Yes
Yes
RMAC
Block cipher
89 cpb
80 cpb
Yes
No
No
UMAC32
UHASH and AES
19 cpb
cpb
No
No
Yes
XMACC-SHA1
Any cipher or
MD function
162 cpb
29 cpb
Yes
Yes
Yes
OpenSSL cung cấp hai loại giao diện với các hàm băm
Giao diện riêng rẽ với mỗi giải thuật băm cụ thể.
Mỗi giải thuật băm có tệp tiêu đề riêng
Tên gọi các hàm là khác nhau cho các giải thuật băm.
Giao diện chung EVP cho mọi loại hàm băm.
Tệp tiêu đề chung: 
Trình tự sử dụng như nhau:
Khởi tạo ngữ cảnh: EVP_DigestInit
Cập nhật dữ liệu băm: EVP_DigestUpdate
Lấy kết quả: EVP_DigestFinal.
VD: Băm với SHA1
#include 
int i;
SHA_CTX ctx;
unsigned char result[SHA_DIGEST_LENGTH];
/* SHA1 has a 20-byte digest. */
unsigned char *s1 = (unsigned char*)"Testing";
unsigned char *s2 = (unsigned char*)"...1...2...3...";
SHA1_Init(&ctx);
SHA1_Update(&ctx, s1, strlen((char*)s1));
SHA1_Update(&ctx, s2, strlen((char*)s2));
/* Yes, the context object is last. */
SHA1_Final(result, &ctx);
printf("SHA1(\"%s%s\") = ", s1, s2);
for (i = 0; i < SHa_DIgEsT_LENGTH; i++) printf("%02x", result[i]); printf("\n");
VD: Băm với giao diện EVP
#include 
#include 
#include 
int i , ol;
EVP_MD_CTX ctx;
unsigned char *result;
unsigned char *s1 = (unsigned char*)"Testing";
unsigned char *s2 = (unsigned char*)"...1...2...3...";
EVP_D igestInit(&ctx, EVP_sha1 ());
EVP_DigestUpdate(&ctx, s1, strlen((char*)s1));
EVP_DigestUpdate(&ctx, s2, strlen((char*)s2));
if (!(result = (unsigned char *)malloc(EVP_MD_CTX_block_size(&ctx))))abortO; EVP_DigestFinal(&ctx, result, &ol);
printf("SHA1(\"%s%s\") = ", s1, s2);
for (i = 0; i < ol; i++) printf("%02x", result[i]); printf("\n");
free(result);
Trình tự băm với Crypto API
Tệp tiêu đề: Wincrypt.h
Khởi tạo ngữ cảnh Provider: CryptAcquireContext
Tạo đối tượng hash: CryptCreateHash
Băm liên tiếp với: CryptHashData
Lấy kết quả: CryptGetHashParam
Giải phóng đói tượng hash: CryptDestroyHash
Ví dụ: Băm dữ liệu với thuật toán SHA-256
BYTE *pbData;
DWORD cbData = sizeof(DWORD), cbHashSize, i;
HCRYPTHASH hSHA256;
HCRYPTPROV hProvider;
unsigned char *s1 = (unsigned char*)"Testing";
unsigned char *s2 = (unsigned char*)"...1...2...3...";
// Khởi tạo ngữ cảnh Provider
CryptAcquireContext(&hProvider, 0, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0);
// Tạo đối tượng hàm băm
CryptCreateHash(hProvider, CALG_SHA_256, 0, 0, &hSHA256);
// Thực hiện băm
CryptHashData(hSHA256, s1, strlen((char*)s1), 0);
CryptHashData(hSHA256, s2, strlen((char*)s2), 0);
// Thực hiện băm...
Ví dụ: Băm dữ liệu với thuật toán SHA-256 (tiếp)
// Lấy kích thước dữ liệu băm được
CryptGetHashParam(hSHA256, HP_HASHSIZE, (BYTE *)&cbHashSize, &cbData, 0); pbData = (BYTE *)LocalAlloc(LMEM_FIXED, cbHashSize);
// Lấy dữ liệu băm được
CryptGetHashParam(hSHA256, HP_HASHVAL, pbData, &cbHashSize, 0);
// Giải phóng đối tượng băm và ngữ cảnh Provider
CryptDestroyHash(hSHA256);
CryptReleaseContext(hProvider, 0);
printf("SHA256(\"%s%s\") = ", s1, s2);
for (i = 0; i < cbHashSize; i++) printf("%02x", pbData[i]);
printf("\n");
LocalFree(pbData);
Với OpenSSL
Tệp tiêu đều 
Gọi hàm HMAC_Init để khởi tạo ngữ cảnh và key sẽ sử dụng
Liên tục gọi hàm HMAC_Update để cập nhật dữ liệu.
Gọi hàm HMAC_Final để kết thúc quá trình băm
Gọi hàm HMAC_cleanup để xóa key khỏi bộ nhớ.
Có thể gọi hàm All-in-one HMAC
Bên nhận kiểm tra lại bằng cách thực hiện băm với với cùng một key và giải thuật và so sánh kết quả
Với OpenSSL
int i;
HMAC_CTX ctx;
unsigned int len;
unsigned char out[20];
unsigned char * key = (unsigned char*)"secret";
int	keylen = strlen((char*)key);
// Khởi tạo HMAC với key là secret
HMAC_Init(&ctx, key, keylen, EVP_sha1( ));
// Thực hiện băm xâu "fr
HMAC_Update(&ctx, (unsigned char*)"hash me pls", 11);
// Lấy kết quả
HMAC_Final(&ctx, out, &len);
for (i = 0; i < len; i++) printf("%02x", out[i]); printf("\n");
Với CryptAPI
Tạo đối tượng Hash với hàm CryptCreateHash, trong đó tham số hKey là một key đã được tạo trước.
Thiết lập thông tin về giải thuật băm với hàm CryptSetHashParam.
Thực hiện băm với hàm CryptHashData
Lấy kích thước, nội của dữ liệu băm được với hàm CryptGetHashParam.
Giải phóng đói tượng Hash và Key
Với CryptAPI
BYTE out[20];
DWORD cbData = sizeof(out), i;
HCRYPTKEY hKey;
HMAC_INFO HMACInfo;
HCRYPTHASH hHash;
HCRYPTPROV hProvider;
// Lấy ngữ cảnh provider CryptAcquireContext(&hProvider, 0,Ms_EnH_rsa_aEs_prov,prov_rsa_aes,crypT_verifycontext);
// Sinh key từ mật khẩu
hKey = CreateKeyFromPassword(hProvider,"secret");
// Tạo đối tượng băm
CryptCreateHash(hProvider, CALG_HMAC, hKey, 0, &hHash);
Với CryptAPI
// Thiết lập giải thuật băm
HMACInfo.HashAlgid = CALG_SHA1;
HMACInfo.pbInnerString = HMACInfo.pbOuterString = 0;
HMACInfo.cbInnerString = HMACInfo.cbOuterString = 0;
CryptSetHashParam(hHash, HP_HMAC_INFO, (BYTE *)&HMACInfo, 0);
// Thực hiện băm
CryptHashData(hHash, (BYTE *)"Hash me plz", 11, 0);
// Lấy kết quả
CryptGetHashParam(hHash, HP_HASHVAL, out, &cbData, 0);
for (i = 0; i < cbData; i++) printf("%02x", out[i]);
printf("\n");
CryptDestroyHash(hHash);
CryptDestroyKey(hKey);
CryptReleaseContext(hProvider, 0);
5.5 Sử dụng Salt
Salt
Chuỗi dữ liệu thêm vào để tăng không gian khóa và chống lại hình thức replay-attack.
Hai bên có thể’ thỏa thuận chung một salt nào đó thay đổi theo thời gian.
Salt thường được thêm vào đầu thông điệp gốc, sau đó thực hiện băm cả salt cả thông điệp.
Bài tập
Viết chương trình mã hóa và giải mã tệp tin bằng giải thuật AES-256 bit. Mật khẩu nhập từ bàn phím. Kiểm tra tính đúng đắn của kết quả bằng giải thuật SHA-256. Sử dụng thư viện OpenSSL. Khuôn dạng dữ liệu của tệp tin sau khi mã hóa có thể’ như sau:
Viết chương trình chat client-server đơn giản trong đó kênh truyền được mã hóa theo giải thuật AES-256. Key được sinh ra từ mật khẩu thỏa thuận trước và không truyền qua mạng, Vector khởi tạo là mã BCD được thiết lập từ ngày và giờ hiện tại của hệ thống (Hàm API GetSystemTime). Ví dụ: Nếu hiện tại là 07h ngày 10/10/2011 thì giá trị dưới dạng hexa của vector khởi tạo là
2011101007000....00
Bài tập
Viết chương trình băm nội dung một file bằng giải thuật HMAC-AES256, sử dụng thư viện OpenSSL. Mật khẩu để băm nhập từ bàn phím.Kết quả băm được lưu vào cuối file.
Viết chương trình kiể’m tra tính toàn vẹn của một file bằng giải thuật HMAC-AES256. Mật khẩu để’ kiểm tra nhập từ bàn phím.

File đính kèm:

  • docxbai_giang_lap_trinh_an_toan_chuong_5_ham_bam_va_xac_thuc_tho.docx
  • pdfsecureprogramming_5_7662_505049.pdf