對數據進行簽名和驗證,是為了防止數據被“盜版”。比較常規的做法是通過公鑰進行驗證。
算法上多用SAH_xxxx,就是哈希算法。由於MD5后來被發現存在“非唯一性”,你會發現現在很多一些下載的文件驗證都用SHA1算法。比如我們下載一個系統.iso鏡像,下載后可以核對一下哈希值,來判斷文件是否完整且正確無誤。
簽名與驗證操作並不復雜。在Windows.Security.Cryptography.Core命名空間下提供支持,像AsymmetricKeyAlgorithmProvider、MacAlgorithmProvider都可以用來生成簽名的key。
本次我就以AsymmetricKeyAlgorithmProvider為例來演示,因為這廝可以生成公鑰/私鑰對,並且支持導入密鑰的操作。簽名后可以把key作為公鑰導出,在驗證時可以導入該公鑰。
第一步,先得到一個AsymmetricKeyAlgorithmProvider實例,不用實例化,直接通過靜態的OpenAlgorithm方法直接獲得,參數是要使用的算法。
AsymmetricKeyAlgorithmProvider asymt = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.DsaSha1);
第二步,調用CreateKeyPair方法生成密鑰對,參數為位數,一般的值為512、1024、2048、4096,此處我用512,正常無異常。
CryptographicKey key = asymt.CreateKeyPair(512);
另外,你還可以以公鑰的形式導出,這樣方便存儲。
publicKey = key.ExportPublicKey();
第三步,可以對數據進行簽名了。
IBuffer data = CryptographicBuffer.ConvertStringToBinary(txtInput.Text.Trim(), BinaryStringEncoding.Utf8);
signedData = CryptographicEngine.Sign(key, data);
CryptographicEngine類公開一系列方法,用來完成加解密,要進行簽名,可調用Sign方法,或者異步等待的SignAsync方法。簽名之后返回簽名后的數據, 以IBuffer的形式存放。
數據簽名后可以進行驗證。
第一步,同樣,需要獲取一個AsymmetricKeyAlgorithmProvider實例。
AsymmetricKeyAlgorithmProvider asmt = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.DsaSha1);
第二步,導入公鑰。調用ImportPublicKey方法就可以導入我們剛才導出的公鑰。
CryptographicKey key = asmt.ImportPublicKey(publicKey);
導入成功后,直接可以返回一個CryptographicKey對象,下面可以直接用它來進行驗證了。注意公鑰必須與當初簽名時導出的公鑰相同,否則無法驗證。
第三步,可以進行驗證了。
IBuffer data = CryptographicBuffer.ConvertStringToBinary(txtVerifyInput.Text.Trim(), BinaryStringEncoding.Utf8); // 注意,第三個參數是你剛才簽名后得到的數據 bool b = CryptographicEngine.VerifySignature(key, data, signedData);
VerifySignature方法用於簽名驗證,第一個參數是公鑰,前后必須一致;第二個參數是待驗證的數據;第三個參數是前面簽名后得到的數據。如果驗證成功,返回true;不成功返回false。
===================================================
看看運行結果。
如果前后輸入的內容相同,驗證就會成功,如果前后輸入的內容不同,驗證就會失敗。