[.NET]Microsoft Codename "Trust Services" 的初體驗

[.NET]Microsoft Codename "Trust Services" 的初體驗

Microsoft Codename "Trust Services" 可讓應用程式透過它的API將資料進行加/解密。

因為它是透過憑證來驗証的,所以在開始前,我們需要先建立一個管理者的憑證,建立方式可以透過 VS.NET開發人員命令提示字元 透過 makecert命令 來建立。

如下,我建立一個Alice的憑證,

 

makecert -r -pe -n "CN=Alice" -sky exchange "Alice.cer" -sv "Alice.pvk"

 

image

image

以上總共需要輸入3次憑證的密碼。

再來透過 pvk2pfx 來產生pfx檔,如下,

 

pvk2pfx -pvk "Alice.pvk" -spc "Alice.cer" -pfx "Alice.pfx" -pi 這裡請輸入前面輸入的密碼(我是用alice)

 

有了管理者的憑證後,就可以到Trust Services Portal,建立您要用的 trust server (需要先用windows live 登入)。

image

一開始請按下 Create ,會建立一個trust Server,名稱是自動產生的。

image

 

再來是設定Trust Services Policy Administrator (TSPA),按下 Set TSPA ,上傳剛才建立的Alice.cer檔案,如下,

image

image

 

以上我們建立一個Trust Server, 名稱為 lnxnhmimbg

為了讓應用程式可以使用,請安裝Microsoft® Codename Trust Services SDK and Management Tool

再來我們寫一個簡單的字串加/解密的程式,來體驗看看。

建立一個Windows Form程式,加入Trust Services SDK的參考(路徑可能在 c:\Program Files\Microsoft\Trust Services Lab SDK and Shell (x64)\bin 之中),如下,

image

專案中,設定那5個DLL Copy到Local為True。

然後,就可以透過SDK,來做資料加/解密,如下的Code,

//初始值設定
            X509Certificate2 alicePrivateX509 = new X509Certificate2(@"d:\Alice.pfx", @"alice");
            Uri policyUri = new Uri(@"example:testUri");
            string ServerName = @"lnxnhmimbg";
            string serviceURL = @"https://trustservicesapi2.cloudapp.net";

            //都還沒有建立過Data Policy時,要先建立Data Policy
            //建立private key
            
            using (PolicyAdministration admin = new PolicyAdministration(
                ServerName,
                serviceURL,
                new PrincipalCertificate(alicePrivateX509)) // Private Key is required
                )
            {
                // Create Data Policy for the given URI and state
                // that resources that correspond to this URI must be encrypted.
                admin.AddDataPolicy(DataPolicy.CreateEncryptDataPolicy(policyUri));
            }
            //設定要加密的字串
            string plainText = "我是亂馬客";
            string cypherText = string.Empty;
            string newPlainText = string.Empty;
            //開始加密
            using (PolicyDecisionPoint decisionPoint = new PolicyDecisionPoint(
                ServerName,
                serviceURL,
                new PrincipalCertificate(alicePrivateX509)) // Private Key is required
                )
            {
                //要加密,所以用ToUntrusted
                using (ITransformation transformation = decisionPoint.GetTransformation(policyUri, PolicyContext.ToUntrusted))
                {
                    //先轉成Byte Array
                    byte[] plainBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
                    //加密
                    byte[] transformedBytes = transformation.Transform(plainBytes);
                    //將加密後的Byte Array轉成Base64字串
                    cypherText = Convert.ToBase64String(transformedBytes);
                }
                MessageBox.Show(cypherText);
                //開始解密
                //因為解密,所以用ToTrusted
                using (ITransformation transformation = decisionPoint.GetTransformation(policyUri, PolicyContext.ToTrusted))
                {
                    //將Base64字串轉回Byte Array
                    byte[] cypherTextArray = Convert.FromBase64String(cypherText);
                    //進行解密
                    byte[] transformedBytes = transformation.Transform(cypherTextArray);
                    //專Byte Array轉回字串
                    newPlainText = System.Text.Encoding.UTF8.GetString(transformedBytes);
                }
                MessageBox.Show(newPlainText);
            }

 

image

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^