1.1 Bo đảm tính toàn vn d liu bng mã băm có khóa
V
V
Bn cn chuyn mt file cho ai đó và cp cho người này mt phương cách để
xác minh tính toàn vn ca file.
#
#
Cp cho người nhn mt khóa bí mt (key). Khóa này có th là mt s được
sinh ngu nhiên, nhưng nó cũng có th là mt nhóm t mà bn và người nhn
đã tha thun. S dng khóa cùng vi mt trong nhng lp gii thut băm có
khóa dn xut t lp System.Security.Cryptography.KeyedHashAlgorithm để
to mã băm có khóa. Gi mã băm này cùng vi file. Khi nhn được file, người
nhn s to mã băm có khóa cho file này bng khóa. Nếu hai mã băm ging
nhau, người nhn s biết rng file này do bn gi đến và nó không b thay đổi
trong quá trình chuyn giao.
Mã băm rt hu ích khi so sánh hai mu d liu để xác định chúng có ging nhau hay
không (c khi bn không th truy xut được d liu gc). Tuy nhiên, bn không th s
dng mã băm để cam đoan vi người nhn v tính toàn vn ca d liu. Nếu có ai đó
chn được d liu, người này có th thay thế d liu và to mã băm mi. Khi người nhn
kim tra mã băm, nó có v đúng nhưng thc tế d liu không ging vi nhng gì bn gi
lúc ban đầu.
Mt gii pháp đơn gin và hiu qu cho vn đề toàn vn d liu là mã băm có khóa
(keyed hash code). Mã băm có khóa cũng tương t như mã băm bình thường (đã được
tho lun trong mc 14.2 và 14.3); tuy nhiên, mã băm có khóa kết hp thêm mt phn t
d liu bí mt (khóa), phn t này ch có người gi và người nhn biết. Nếu không có
khóa, không ai có th to được mã băm đúng t tp d liu cho trước.
# Khóa phi được gi bí mt. Nếu ai đó biết khóa thì có th to ra mã băm có
khóa hp l, nghĩa là bn s không th xác định h có thay đổi ni dung ca tài
liu hay không. Vì lý do này, bn không nên chuyn giao hay lưu tr khóa cùng
vi tài liu cn được bo v tính toàn vn. Mc 14.10 s cung cp mt cơ chế
mà bn có th s dng để trao đổi khóa mt cách an toàn.
To mã băm có khóa cũng tương t như to mã băm bình thường vì lp tru tượng
System.Security.Cryptography.KeyedHashAlgorithm m rng lp
System.Security.Cryptography.HashAlgorithm. Lp KeyedHashAlgorithm cung cp mt
lp cơ s để tt c các gii thut băm có khóa dn xut t đó. Thư vin lp .NET
Framework có hai hin thc gii thut băm có khóa được lit kê trong bng 14.2; mi
hin thc là mt thành viên ca không gian tên System.Security.Cryptography.
Bng 14.2 Các hin thc gii thut băm có khóa
Gii thut/Tên lp Kích thước khóa (bit) Kích thước mã băm
(bit)
HMACSHA1 bt k 160
MACTripleDES 64, 128, 192 64
Cũng như các gii thut băm chun, bn có th trc tiếp to ra các đối tượng gii thut
băm có khóa, hoc bn có th s dng phương thc tĩnh KeyedHashAlgorithm.Create vi
đối s là tên gii thut. S dng factory cho phép bn viết mã lnh tng quát và mã lnh
này có th làm vic vi bt k hin thc gii thut băm có khóa nào, nhưng theo bng
14.2, mi lp h tr các chiu dài khóa khác nhau nên bn phi cung cp giá tr này trong
mã lnh tng quát.
Nếu s dng phương thc khi dng để to đối tượng băm có khóa, bn có th truyn
khóa cho phương thc này. Khi s dng factory, bn phi thiết lp khóa bng thuc tính
Key (được tha kế t lp KeyedHashAlgorithm). Mt khi đã cu hình khóa, gi phương
thc ComputeHash vi đối s là mt mng byte hay mt đối tượng System.IO.Stream.
Gii thut băm có khóa s x lý d liu nhp và tr v mt mng byte cha mã băm có
khóa. Bng 14.2 cho thy kích thước ca mã băm do mi gii thut băm có khóa sinh ra.
Lp KeyedHashStreamExample dưới đây trình bày cách to mã băm có khóa t mt file.
Bn phi ch định tên file và mt khóa làm đối s dòng lnh. ng dng này s dng lp
HMACSHA1 để to mã băm có khóa và ri hin th nó ra ca s Console.
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
public class KeyedHashStreamExample {
public static void Main(string[] args) {
// To mng byte t chui key (là đối s dòng lnh th hai).
byte[] key = Encoding.Unicode.GetBytes(args[1]);
// To mt đối tượng HMACSHA1
// (truyn key cho phương thc khi dng).
using (HMACSHA1 hashAlg = new HMACSHA1(key)) {
// M mt FileStream để đọc file (tên file
// được ch định trong đối s dòng lnh th nht).
using (Stream file = new FileStream(args[0],
FileMode.Open)) {
// To mã băm có khóa cho ni dung file.
byte[] hash = hashAlg.ComputeHash(file);
// Hin th mã băm có khóa ra ca s Console.
Console.WriteLine(BitConverter.ToString(hash));
}
}
}
}
Lnh KeyedHashStreamExample KeyedHashStreamExample.cs secretKey s sinh ra
mã băm như sau:
95-95-2A-8E-44-D4-3C-55-6F-DA-06-44-27-79-29-81-15-C7-2A-48
ng dng KeyedHashMessageExample.cs (có trong đĩa CD đính kèm) trình bày cách to
mt mã băm có khóa t mt chui. ng dng này yêu cn hai đối s dòng lnh: mt
thông đip và mt khóa, và s to ra mã băm có khóa cho chui thông đip bng khóa
này. Ví d, lnh KeyedHashMessageExample "Two hundred dollars is my final
offer" secretKey s sinh ra mã băm như sau:
83-43-0D-9D-07-6F-AA-B7-BC-79-CD-6F-AD-7B-FA-EA-19-D1-24-44
1.2 Bo v file bng phép mt hóa đối xng
V
V
Bn cn mt hóa mt file bng gii thut mt hóa đối xng (symmetric
encryption).
#
#
Trước hết, bn phi th hin hóa mt trong các lp gii thut đối xng c th
dn xut t lp System.Security.Cryptography.SymmetricAlgorithm. Sau đó,
gi phương thc CreateEncryptor hay CreateDecryptor ca đối tượng
SymmetricAlgorithm để thu ly mt đối tượng có hin thc giao din
System.Security.Cryptography.ICryptoTransform. S dng đối tượng
ICryptoTransform này kết hp vi mt đối tượng
System.Security.Cryptography.CryptoStream để mt hóa hay gii mt hóa d
liu đọc t mt file (được truy xut bng mt đối tượng System.IO.FileStream).
Lp tru tượng SymmetricAlgorithm cung cp mt lp cơ s để tt c các hin thc gii
thut đối xng c th dn xut t đó. Thư vin lp .NET Framework có bn hin thc
gii thut đối xng c th được lit kê trong bng 14.3, mi lp là mt thành viên ca
không gian tên System.Security.Cryptography. Các lp có đuôi là CryptoServiceProvider
bc ly các chc năng do Win32 CryptoAPI cung cp, trong khi các lp có đuôi là
Managed (hin ti ch có RijndaelManaged) được hin thc hoàn toàn bng mã lnh
được-qun-lý. Bng này cũng cho thy chiu dài khóa mà mi gii thut h tr (chiu dài
mc định được in đậm). Nói chung, khóa càng dài, càng khó gii mt hóa ciphertext nếu
không có khóa, nhưng cũng có nhiu yếu t khác cn xem xét.
Bng 14.3 Các hin thc gii thut đối xng
Tên gii thut Tên lp Chiu dài khóa
(bit)
DES DESCryptoServiceProvider 64
TripleDES hay
3DES TripleDESCryptoServiceProvider 128, 192
RC2 RC2CryptoServiceProvider
40, 48 56, 64, 72,
80, 88, 96, 104,
112, 120, 128
Rijndael RijndaelManaged 128, 192, 256
Mc dù bn có th to ra các th hin ca các lp gii thut đối xng mt cách trc tiếp,
lp cơ s SymmetricAlgorithm là mt factory cho các lp hin thc c th dn xut t
đó. Gi phương thc tĩnh SymmetricAlgorithm.Create vi đối s là tên gii thut s tr
v mt đối tượng thuc kiu đã được ch định. S dng factory cho phép bn viết mã lnh
tng quát, và mã lnh này có th làm vic vi bt k hin thc gii thut đối xng nào:
string algName = "3DES";
SymmetricAlgorithm alg = SymmetricAlgorithm.Create(algName);
# Nếu bn gi SymmetricAlgorithm.Create và không ch định tên gii thut,
SymmetricAlgorithm s tr v mt đối tượng RijndaelManaged. Nếu bn ch
định mt giá tr không hp l, SymmetricAlgorithm s tr v null. Bn có th
cu hình các ánh x tên/lp mi bng file cu hình (xem tài liu .NET
Framework SDK để biết thêm chi tiết).
Trước khi mt hóa d liu vi mt trong các lp gii thut đối xng, bn cn mt khóa
(key) và mt vectơ khi động (initialization vector). Khóa là thông tin bí mt dùng để mt
hóa và gii mt hóa d liu. Vectơ khi động là d liu ngu nhiên được truyn cho gii
thut mt hóa. Bn phi s dng cùng khóa và vectơ khi động cho c mt hóa và gii
mt hóa d liu. Tuy nhiên, ch có khóa là cn phi được gi bí mt, bn có th lưu tr
hay gi vectơ khi động cùng vi d liu đã-được-mt-hóa.
Khóa cho mi lp dn xut t SymmetricAlgorithm có th được truy xut thông qua
thuc tính Key, và vectơ khi động có th được truy xut thông qua thuc tính IV. Cách
đơn gin nht và ít li nht để to khóa và vectơ khi động mi là để lp t to chúng
giùm bn. Sau khi đã to mt đối tượng gii thut đối xng, nếu bn không thiết lp các
thuc tính Key và IV cho nó, đối tượng này s t động to ra các giá tr mi ngay khi bn
cho gi mt thành viên có s dng các giá tr Key và IV. Mt khi đã được thiết lp, đối
tượng gii thut đối xng s tiếp tc s dng các giá tr Key và IV này. Để thay đổi giá tr
ca Key và IV, bn có th gán trc tiếp các giá tr mi hoc gi phương thc
GenerateKey và GenerateIV (buc đối tượng gii thut đối xng to ra các giá tr ngu
nhiên mi).
Bn không th trc tiếp thc hin mt hóa và gii mt hóa vi mt đối tượng gii thut
đối xng. Mt khi đã to và cu hình đối tượng gii thut đối xng, bn phi gi phương
thc CreateEncryptor hay CreateDecryptor ca nó để thu ly mt đối tượng có hin thc
giao din System.Security.Cryptography.ICryptoTransform. Kế đó, bn có th s dng
các phương thc ca đối tượng ICryptoTransform này để mt hóa và gii mt hóa d
liu. Tuy nhiên, đối tượng ICryptoTransform yêu cu bn truyn d liu theo tng khi
(có kích thước c định) và lp (bng tay) khi d liu cui cùng vì khi này ít khi có kích
thước đúng.
Giao din ICryptoTransform không quá khó s dng, nhưng không my thân thin; do
vy .NET Framework kèm thêm lp System.Security.Cryptography.CryptoStream. Đây
là lp dn xut t System.IO.Stream, dùng để đơn gin hóa vic mt hóa và gii mt hóa
d liu được đọc t các đối tượng Stream khác. Lp này cho phép bn mt hóa và gii
mt hóa d liu t các file và các kết ni mng mt cách d dàng bng mt mô hình x
quen thuc, và nó cung cp cho bn tt c các tin ích quen thuc khi truy xut d liu
da-vào-Stream.
Phương thc khi dng ca CryptoStream yêu cu ba đối s: mt Stream nm dưới, mt
th hin ca ICryptoTransform, và mt giá tr thuc kiu lit kê
System.Security.Cryptography.CryptoStreamMode. Giá tr CryptoStreamMode cho biết
chế độ ca đối tượng CryptoStream mi; các giá tr hp l là Read và Write. Khi bn gi
phương thc Read hay Write ca CryptoStream, CryptoStream s s dng th hin
ICryptoTransform để mt hóa và gii mt hóa d liu đang truyn qua CryptoStream. Đối
tượng CryptoStream bo đảm kích thước khi dùng cho th hin ICryptoTransform luôn
đúng.
Cu hình ca mt đối tượng CryptoStream có tính linh hot cao, nhưng có th hơi khó
hiu. Bng 14.4 mô t hot động ca mt đối tượng CryptoStream da trên chế độ ca
CryptoStream và kiu th hin ICryptoTransform được s dng trong phương thc khi
dng ca CryptoStream.