#副標=安全管制新功能(2) #大標=網頁資料加密與簽章 #眉標= ASP.NET 2.0 #作者=文/王寧疆 ================== box 程式1 =============== txtProtectedData.Text = Convert.ToBase64String( ProtectedData.Protect(data, entropy, DataProtectionScope.CurrentUser)); ============ end ============ =============== box 程式2 ================= txtRestore.Text = Encoding.UTF8.GetString( ProtectedData.Unprotect(data, entropy, DataProtectionScope.CurrentUser)); ================== end ================== ============== box 程式3 ============= //存放欲加密的資料的陣列 byte[] buf=new byte[16]; //欲加密的資料 string strData = "Test secret data"; //將欲加密的資料放入陣列 buf = Encoding.UTF8.GetBytes(strData); ================ end ================= =============== box 程式4 ============= <%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> ================== end ================== ================= box 程式5 ==================== private void ShowXmlFile(string strFileName) { //建立負責讀取檔案的StreamReader類別的物件 StreamReader sr = new StreamReader(strFileName, Encoding.Default); //將檔案的內容讀到TextBox控制項 TextBox1.Text = sr.ReadToEnd(); //關閉檔案 sr.Close(); } ====================== end =================== =============== box 程式6 ================= protected void Page_Load(object sender, EventArgs e) { //只有網頁第一次執行才需要執行的工作 if (!IsPostBack) { //建立RSACryptoServiceProvider類別的物件 RSA Signkey= new RSACryptoServiceProvider(); //匯出驗証數位簽章使用的公開金鑰 Session["VerifyPublicKey"] = Signkey.ExportParameters(false); //匯出執行數位簽章使用的私密金鑰 Session["SignPrivateKey"] = Signkey.ExportParameters(true); //建立RSACryptoServiceProvider類別的物件 RSA EncryptKey = new RSACryptoServiceProvider(); //匯出執行XML文件解密使用的私密金鑰 Session["DecryptPrivateKey"] = EncryptKey.ExportParameters(true); //匯出執行XML文件加密使用的公開金鑰 Session["EncryptPublicKey"] = EncryptKey.ExportParameters(false); } } ====================== end ==================== ================== box 程式7 ================= protected void btnLoad_Click(object sender, EventArgs e) { //顯示名稱為Customers.xml的XML文件的內容到網頁上 ShowXmlFile(Server.MapPath("~/Customers.xml")); } ====================== end =================== =================== box 程式8 ==================== protected void btnSign_Click(object sender, EventArgs e) { //建立XmlDocument類別的物件 XmlDocument doc = new XmlDocument(); //載入檔案名稱為Customers.xml的XML文件 doc.Load(Server.MapPath("~/Customers.xml")); //建立SignedXml類別的物件 SignedXml sig = new SignedXml(doc); //建立RSACryptoServiceProvider類別的物件 RSA key = new RSACryptoServiceProvider(); //匯入簽章用的私密金鑰 key.ImportParameters((RSAParameters)Session["SignPrivateKey"]); //將匯入的私密金鑰拿給SignedXml類別的物件使用 sig.SigningKey = key; //傳入空字串表示要對整份文件執行數位簽章 Reference refr = new Reference(""); //簽章文件的Transform方法 refr.AddTransform(new XmlDsigEnvelopedSignatureTransform()); //加入參考關係 sig.AddReference(refr); //執行數位簽章 sig.ComputeSignature(); //將簽章的結果加到XML文件的結尾 doc.DocumentElement.AppendChild(sig.GetXml()); //儲存帶簽章內容的XML文件 doc.Save(Server.MapPath("~/Customers-signed.xml")); //顯示帶簽章內容的XML文件 ShowXmlFile(Server.MapPath("~/Customers-signed.xml")); //不顯示錯誤訊息 lblMessage.Text = ""; } ======================= end ================== ================== box 程式9 ==================== XML文件原有的內容 原文省略 數位簽章 ======================= end ====================== ===================== box 程式10 ==================== protected void btnVerify_Click(object sender, EventArgs e) { //建立XmlDocument類別的物件 XmlDocument doc = new XmlDocument(); //載入檔案名稱為Customers-signed xml的XML文件 doc.Load(Server.MapPath("~/Customers-signed.xml")); //建立XmlNamespaceManager類別的物件 XmlNamespaceManager nsm = new XmlNamespaceManager(new NameTable()); //加入XML文件簽章的標準Namespace nsm.AddNamespace("dsig", SignedXml.XmlDsigNamespaceUrl); //取得dsig:Signature標籤 XmlElement sigElt = (XmlElement)doc.SelectSingleNode("//dsig:Signature", nsm); //建立SignedXml類別的物件 SignedXml sig = new SignedXml(doc); //載入指定的標籤的內容 sig.LoadXml(sigElt); //建立RSACryptoServiceProvider類別的物件 RSA key = new RSACryptoServiceProvider(); //匯入驗証簽章用的公開金鑰 key.ImportParameters((RSAParameters)Session["VerifyPublicKey"]); //如果簽章驗証無誤 if (sig.CheckSignature(key)) { //顯示簽章正確的訊息 lblMessage.Text = "驗証正確"; } else { //顯示簽章有誤的訊息 lblMessage.Text = "驗証失敗"; } } ======================= end ================== =================== box 程式11 ====================== protected void btnEncrypt_Click(object sender, EventArgs e) { //建立XmlDocument類別的物件 XmlDocument doc = new XmlDocument(); //載入檔案名稱為Customers-signed.xml的XML文件 doc.Load(Server.MapPath("~/Customers-signed.xml")); //建立EncryptedXml類別的物件 EncryptedXml exml = new EncryptedXml(doc); //建立RSACryptoServiceProvider類別的物件 RSA key = new RSACryptoServiceProvider(); //匯入加密XML文件用的公開金鑰 key.ImportParameters( (RSAParameters)Session["EncryptPublicKey"]); //指定要使用匯入的公開金鑰加密名稱為Customer標籤的內容 exml.AddKeyNameMapping("Customer", key); //取出Customers標籤中的Customer標籤 XmlElement CustomerElement = (XmlElement)doc.SelectSingleNode("//Customers/Customer"); //加密指定的標籤的內容 EncryptedData encryptedPayment = exml.Encrypt(CustomerElement, "Customer"); //使用加密後的內容置換掉原有標籤的內容 EncryptedXml.ReplaceElement(CustomerElement, encryptedPayment, false); //將加密後的內容儲存成新的XML文件 doc.Save(Server.MapPath("~/Customers-signed-encrypted.xml")); //顯示加密後的新XML文件 ShowXmlFile(Server.MapPath("~/Customers-signed-encrypted.xml")); //不顯示錯誤訊息 lblMessage.Text = ""; } ======================== end ========================= =================== box 程式12 ===================== 經過加密的Customer標籤內容 2 Mary 2222 ========================= end ====================== ================ box 程式13 =================== protected void btnDecrypt_Click(object sender, EventArgs e) { //建立XmlDocument類別的物件 XmlDocument doc = new XmlDocument(); //載入檔案名稱為Customers-signed-encrypted.xml的XML文件 doc.Load(Server.MapPath("~/Customers-signed-encrypted.xml")); //建立EncryptedXml類別的物件 EncryptedXml exml = new EncryptedXml(doc); //建立RSACryptoServiceProvider類別的物件 RSA key = new RSACryptoServiceProvider(); //匯入解密XML文件用的私密金鑰 key.ImportParameters((RSAParameters)Session["DecryptPrivateKey"]); //指定要使用匯入的私密金鑰解密名稱為Customer標籤的內容 exml.AddKeyNameMapping("Customer", key); //解密XML文件中被加密的標籤內容 exml.DecryptDocument(); //將解密後的內容儲存成新的XML文件 doc.Save(Server.MapPath("~/Customers-signed-decrypted.xml")); //顯示解密後的新XML文件 ShowXmlFile(Server.MapPath("~/Customers-signed-decrypted.xml")); //不顯示錯誤訊息 lblMessage.Text = ""; } ======================= end ==================