2017-06-21 37 views
2

因此,我有一個將PKCS#7文件返回給客戶端的WebAPI。客戶端編寫爲C#PCL,因此可用於Xamarin iOS和Android項目。如何解碼/解密C#PCL中的SignedCMS/PKCS#7

我最初的測試工作正常,因爲我在我的單元測試中編碼和解碼,並可以使用Pkcs庫。似乎我找不到任何解碼客戶端數據的方式,因爲我不知道任何可以與PCL一起工作的Pkcs庫。

有人可以告訴我/如果這可以做到?

回答

2

所以,我也結束了開關我的項目.netstandard 1.4,並使用Portable.BouncyCastle解碼CMS在服務器端創建。

這是我用來解碼Cms的代碼。我有點相信這也是檢查簽名,因爲在BouncyCastle中沒有明確的方法來執行此操作,就像通過框架代碼,即CheckSignature()一樣。

var cmsParser = new Org.BouncyCastle.Cms.CmsSignedDataParser(dataBytes); 
var cmsSignedContent = cmsParser.GetSignedContent(); 
var contentStream = cmsSignedContent.ContentStream; 
var memoryStream = new MemoryStream(); 
contentStream.CopyTo(memoryStream); 
byte[] contentBytes = memoryStream.ToArray(); 
var decodedContent = Encoding.UTF8.GetString(contentBytes); 

此外,我加入這個驗證簽名信息:

cmsParser.GetSignedContent().Drain(); 
var certStore = cmsParser.GetCertificates("Collection"); 
var signerInfos = cmsParser.GetSignerInfos(); 
var signers = signerInfos.GetSigners(); 

foreach (SignerInformation signer in signers) 
{ 
    var certCollection = certStore.GetMatches(signer.SignerID); 
    foreach (Org.BouncyCastle.X509.X509Certificate cert in certCollection) 
    { 
     var result = signer.Verify(cert); 
     if (!result) 
     { 
      throw new Exception("Certificate verification error, the signer could not be verified."); 
     } 
    } 
} 

我不是100%肯定,如果這是我需要做的,但我的客戶將通過SSL通信,他們是使用HMAC身份驗證與appId和客戶端的祕密,所以我不太在意運輸問題。我基本上正在傳輸一個「許可證」文件,我想確保內容在保存在客戶端設備上後不會被篡改。

如果有人有任何建議或擔憂,請讓我知道。 謝謝。

0

我目前使用PCLCrypto在客戶端(在Xamarin Forms項目中)使用PKCS#7進行加密和解密。我認爲它會做你所需要的。

的PKCS#7維基例子可以發現here

+0

好吧,所以我認爲用PKCS7包含的證書被用來解密內容。在PCLCrypto示例代碼中,它們將「keyMaterial」作爲byte []提供。如何從PKCS容器中獲取證書以使用?在服務器端你使用SignedCms,然後只是.Decode()它,它使用幕後證書(或者至少我認爲它就是這麼做的) – jmichas

+0

@jmichas所以我實際上只是在客戶端上加密和解密字符串而不是證書。不知道你是否可以導出或以某種方式從證書中提取數據。你正在嘗試使用哪種證書對象?還有[BouncyCastle-PCL](https://github.com/onovotny/BouncyCastle-PCL),看起來它可能有一些證書和CMS相關的代碼,但它不是我曾經研究過的並且看起來缺乏的東西除非它被保存在其他地方。 – hvaughan3

+0

我在服務器端使用pfx,並將它作爲X509Certificate2簽名。我認爲那部分工作正常。問題是我不知道客戶端的任何庫。我還製作了一個.net標準1.4版本的客戶端庫,並嘗試使用內置的system.security內容,但不幸的是.net標準內容不包含SignedCms。它確實有EnvelopedCms,但我認爲這需要我分享鑰匙/證書。我試圖做到這一點,因此消費者不需要擔心安裝證書。 – jmichas