你如何在 C# PCL 中 decode/decrypt a SignedCMS/PKCS#7
How do you decode/decrypt a SignedCMS/PKCS#7 in C# PCL
所以,我有一个 WebAPI,它向客户端返回一个 PKCS#7 文件。客户端以 C# PCL 编写,因此可以在 Xamarin iOS 和 Android 项目中使用。
我的初始测试运行良好,因为我在单元测试中进行了编码和解码,并且可以使用 Pkcs 库。似乎我找不到在客户端解码数据的任何方法,因为我不知道任何与 PCL.
一起使用的 Pkcs 库
谁能告诉我how/if这可以做到吗?
我目前使用 PCLCrypto 在客户端(在 Xamarin Forms 项目中)使用 PKCS#7 进行加密和解密。我想它也会满足您的需求。
可以找到 PKCS#7 wiki 示例 here
所以,我最终将我的项目切换到 .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 进行通信,并且他们正在使用带有 appId 和客户端密码的 HMAC 身份验证,所以我不太关心传输过程问题。我基本上是在传输一个 "license" 文件,我想确保内容在保存到客户端设备后不被篡改。
如果有人对此有任何建议或疑虑,请告诉我。
谢谢
所以,我有一个 WebAPI,它向客户端返回一个 PKCS#7 文件。客户端以 C# PCL 编写,因此可以在 Xamarin iOS 和 Android 项目中使用。
我的初始测试运行良好,因为我在单元测试中进行了编码和解码,并且可以使用 Pkcs 库。似乎我找不到在客户端解码数据的任何方法,因为我不知道任何与 PCL.
一起使用的 Pkcs 库谁能告诉我how/if这可以做到吗?
我目前使用 PCLCrypto 在客户端(在 Xamarin Forms 项目中)使用 PKCS#7 进行加密和解密。我想它也会满足您的需求。
可以找到 PKCS#7 wiki 示例 here
所以,我最终将我的项目切换到 .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 进行通信,并且他们正在使用带有 appId 和客户端密码的 HMAC 身份验证,所以我不太关心传输过程问题。我基本上是在传输一个 "license" 文件,我想确保内容在保存到客户端设备后不被篡改。
如果有人对此有任何建议或疑虑,请告诉我。 谢谢