俞志兵
南京市天印高級(jí)中學(xué) 南京 211151
作者:俞志兵,本科,中學(xué)一級(jí)教師,長(zhǎng)期從事高中信息技術(shù)教學(xué)工作,任信息技術(shù)教研組組長(zhǎng),擅長(zhǎng)網(wǎng)站開(kāi)發(fā)。
總的來(lái)說(shuō),加密有兩種形式:1)對(duì)稱加密,加密和解密時(shí)使用的是同一個(gè)密鑰;2)非對(duì)稱加密,加密和解密時(shí)將使用不同的密鑰。通常是用公鑰作為加密密鑰,任何人都可以用它來(lái)加密信息。私鑰才是用來(lái)解密密鑰的,它只能用來(lái)對(duì)使用其對(duì)應(yīng)的公鑰加密的數(shù)據(jù)進(jìn)行解密。對(duì)稱加密相對(duì)而言速度更快,但由于加密者和解密者都知道這個(gè)唯一的密鑰,因此安全性更差一些。非對(duì)稱加密則通過(guò)密鑰的方法來(lái)解決這個(gè)問(wèn)題,由于私鑰永遠(yuǎn)不會(huì)暴露,所以第三方更加難以破解其加密的信息。由于密鑰的方法需要更長(zhǎng)的處理時(shí)間,因此通常的方法是使用非對(duì)稱密鑰加密機(jī)制在因特網(wǎng)上實(shí)現(xiàn)對(duì)對(duì)稱密鑰的加密,這樣就使這個(gè)用于加密的密鑰更安全,不會(huì)暴露給第三方。
在.NET的命名空間System.Security.Cryptography中提供了幾種算法??捎玫姆菍?duì)稱算法包括DSA(Digital Signature Algorithm,數(shù)字簽名算法)和RSA(Rivest-Shamir-Adleman算法,它由3個(gè)發(fā)明者的名字組成:Ronald Rivest、Adi Shamir和Leonard Adleman)兩種。其中DSA只能夠用來(lái)對(duì)數(shù)據(jù)進(jìn)行“簽名”,因此通常用來(lái)做驗(yàn)證,而RSA更加通用。DSA現(xiàn)在是美國(guó)政府使用的數(shù)字驗(yàn)證的標(biāo)準(zhǔn)。
.NET框架中可以找到的對(duì)稱加密算法包括DES(Data Encryption Standard,數(shù)字加密標(biāo)準(zhǔn))、Triple DES(3DES)、RC2(Ron’s Code或Rivest’s Cipher,都是源于Ronald Rivest)和Rijndael(源于其發(fā)明者John Daemem、Vincent Rijman的名字)。DES成為標(biāo)準(zhǔn)已經(jīng)有一段時(shí)間,盡管它也不斷發(fā)生變化。3DES和RC2都是DES的變種。3DES是通過(guò)對(duì)數(shù)據(jù)進(jìn)行3次獨(dú)立的DES加密,扣除奇偶校驗(yàn)位,其總的密鑰長(zhǎng)度也達(dá)到168位。RC2的密鑰長(zhǎng)度是可以變化的,最大可以達(dá)到128(如果要更長(zhǎng)的密鑰,可以使用RC3、RC4等),因此根據(jù)密鑰長(zhǎng)度不同,可能比DES更脆弱或更強(qiáng)壯。Rijndael是一種完全不同的加密方法,現(xiàn)在已經(jīng)被接納為新的AES(高級(jí)加密標(biāo)準(zhǔn))。該標(biāo)準(zhǔn)的目標(biāo)是替代DES。
由于.NET框架中的類是針對(duì)數(shù)據(jù)流進(jìn)行優(yōu)化的,因此需要花一些時(shí)間來(lái)處理數(shù)據(jù)格式轉(zhuǎn)換。同樣需要定義一個(gè)密鑰以及執(zhí)行加密或解密操作的初始向量(IV)。需要使用IV應(yīng)歸究于加密的本性:為一串?dāng)?shù)據(jù)位計(jì)算加密值時(shí),將會(huì)用到前面一串?dāng)?shù)據(jù)位的加密值。由于在加密開(kāi)始時(shí)并不存在這些值,因此用IV來(lái)代替。在實(shí)踐中,IV和密鑰都將表示為一個(gè)字節(jié)的數(shù)組,而在DES加密中,其長(zhǎng)度是64位(8字節(jié)),由于解密算法與加密算法類似,加密需要寫(xiě)入加密數(shù)據(jù)的目標(biāo)數(shù)據(jù)流,而解密需要一個(gè)從中讀取已加密數(shù)據(jù)的源數(shù)據(jù)流。
對(duì)一個(gè)字符串進(jìn)行加密所需的步驟:將源字符串轉(zhuǎn)換為一個(gè)字節(jié)數(shù)組;初始化一個(gè)加密算法類;使用這個(gè)加密算法類來(lái)生成一個(gè)加密者(encryptor)對(duì)象,實(shí)現(xiàn)Icrypto-Transform接口,它需要密鑰和IV值;使用加密者對(duì)象來(lái)初始化一個(gè)密文數(shù)據(jù)流(CryptoStream對(duì)象),該數(shù)據(jù)流還需要知道要加密哪些數(shù)據(jù),以及用來(lái)寫(xiě)入加密數(shù)據(jù)的目標(biāo)數(shù)據(jù)流;使用這個(gè)密文數(shù)據(jù)流生成已加密數(shù)據(jù),并寫(xiě)到由前面創(chuàng)建的源字節(jié)數(shù)組創(chuàng)建的目標(biāo)內(nèi)存數(shù)據(jù)流中;獲取存儲(chǔ)在這個(gè)數(shù)據(jù)流中的字節(jié)數(shù)據(jù);將這些字節(jié)數(shù)據(jù)轉(zhuǎn)換成一個(gè)字符串。
解密所采用的模式與加密類似:將源字符串轉(zhuǎn)換成一個(gè)字節(jié)數(shù)組;根據(jù)這個(gè)字節(jié)數(shù)組填充內(nèi)存數(shù)據(jù)流的值;初始化一個(gè)加密算法類;使用加密算法類生成一個(gè)解密者(decryptor)對(duì)象,實(shí)現(xiàn)ICryptoTransform接口,它需要密鑰和IV值;使用解密者對(duì)象來(lái)初始化一個(gè)密文數(shù)據(jù)流(ICryptoStream)對(duì)象,該數(shù)據(jù)流還需要知道解密什么數(shù)據(jù),并需要一個(gè)從中讀取已加密數(shù)據(jù)的源數(shù)據(jù)流;使用密文數(shù)據(jù)流來(lái)讀取已經(jīng)解密數(shù)據(jù)(可以使用StreamReader.ReadToEnd方法來(lái)獲取字符串型結(jié)果)。
限于篇幅,本文只給出加密方法,讀者可以根據(jù)加密方法自己寫(xiě)出解密方法。
在網(wǎng)站根目錄下,新建文件夾(SecurityLib),在這個(gè)文件夾中新建類,命名為StringEncryptor。其Encrypt()方法如下所示:
public static string Encrypt(string sourceData)
{
set key and initialization vector values
byte[] key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
try
{ convert data to byte array
byte[] sourceDataBytes =
System.Text.ASCIIEncoding.ASCII.GetBytes(sourceData);
get target memory stream
MemoryStream tempStream = new MemoryStream();
get encryptor and encryption stream
DESCryptoServiceProvider encryptor =
new DESCryptoServiceProvider();
CryptoStream encryptionStream =
new CryptoStream(tempStream,
encryptor.CreateEncryptor(key, iv),
CryptoStreamMode.Write);
encrypt data
encryptionStream.Write(sourceDataBytes, 0,
sourceDataBytes.Length);
encryptionStream.FlushFinalBlock();
put data into byte array
byte[] encryptedDataBytes = tempStream.GetBuffer();
convert encrypted data into string
return Convert.ToBase64String(encryptedDataBytes, 0,(int)tempStream.Length);
}
}
1)網(wǎng)站根目錄下新建Web頁(yè)面,命名為SecurityTest.asp,做如下編輯:
Enter data to encrypt:
Enter data to decrypt:
2)修改SecurityTest.aspx.cs中的代碼:
using System;
…
using System.Text;
using SecurityLib;
…
protected void processButton_Click(object sender, EventArgs e)
{
string stringToEncrypt = encryptBox.Text;
string stringToDecrypt = decryptBox.Text;
string encryptedString =
StringEncryptor.Encrypt(stringToEncrypt);
if (stringToDecrypt == "")
{
stringToDecrypt = encryptedString;
}
string decryptedString =
StringEncryptor.Decrypt(stringToDecrypt);
StringBuilder sb = new StringBuilder();
sb.Append(“Encrypted data: “);
sb.Append(encryptedString);
sb.Append(“
Decrypted data: “);
sb.Append(decryptedString);
result.Text = sb.ToString();
}
3)在瀏覽器中運(yùn)行SecurityTest.aspx,在第一個(gè)要加密的文本框中輸入“i am yuzhibing”,然后點(diǎn)擊Process按鈕,其結(jié)果如圖1所示。
現(xiàn)在絕大部分電子商務(wù)網(wǎng)站或平臺(tái),都需要用戶檔案系統(tǒng),需要用戶編輯客戶詳情,包括信用卡詳情。信用卡中的信息出于安全因素考慮,必須加密后保存到數(shù)據(jù)層的數(shù)據(jù)庫(kù)中。登錄客戶編輯自己的信息,就需要從數(shù)據(jù)庫(kù)中解密到表示層。
[1]鄭齊心,房大偉,劉云峰.ASP.NET項(xiàng)目開(kāi)發(fā)案例全程實(shí)錄[M].2版.北京:清華大學(xué)出版社,2011.
[2]趙松濤,陳小龍.Visual Studio 2005+SQL Server2005數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開(kāi)發(fā)[M].北京:電子工業(yè)出版社,2007.
[3]Darie C, Watson K. ASP.NET 2.0電子商務(wù)開(kāi)發(fā)實(shí)戰(zhàn)[M].北京:人民郵電出版社,2007.
| 岫岩| 苏尼特左旗| 西平县| 全州县| 南漳县| 贺州市| 吴堡县| 罗山县| 道孚县| 宿松县| 蒲江县| 宁夏| 会东县| 瓮安县| 曲麻莱县| 当阳市| 太和县| 汾西县| 济源市| 通城县| 祁门县| 邵阳县| 洪洞县| 灵台县| 吉木萨尔县| 大丰市| 屯留县| 牙克石市| 临高县| 广元市| 八宿县| 台中市| 新邵县| 买车| 宜兴市| 武乡县| 崇义县| 漠河县| 潜山县| 塔城市|