[.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"
以上總共需要輸入3次憑證的密碼。
再來透過 pvk2pfx 來產生pfx檔,如下,
pvk2pfx -pvk "Alice.pvk" -spc "Alice.cer" -pfx "Alice.pfx" -pi 這裡請輸入前面輸入的密碼(我是用alice)
有了管理者的憑證後,就可以到Trust Services Portal,建立您要用的 trust server (需要先用windows live 登入)。
一開始請按下 Create ,會建立一個trust Server,名稱是自動產生的。
再來是設定Trust Services Policy Administrator (TSPA),按下 Set TSPA ,上傳剛才建立的Alice.cer檔案,如下,
以上我們建立一個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 之中),如下,
專案中,設定那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);
}
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^