这不是100%的c#或ASP.NET问题,而是安全和编程的混合体。所以我向前道歉。我需要将文件签名模块集成到我的ASP.NET Web应用程序中。我还需要编写一个实用程序来验证签名。我知道如何签署文件并验证它。这是我签名的方式:
private byte[] SignFile(byte[] fileData){
X509Certificate2 cert=GetCertificate();
RSACryptoServiceProvider csp = cert.PrivateKey;
SHA1Managed sha1 = new SHA1Managed();
byte[] hash = sha1.ComputeHash(fileData);
return csp.SignData(hash, CryptoConfig.MapNameToOID("SHA1"));
}
到目前为止一切顺利。另一方面,在验证时我需要公钥。所以这是我的问题。我是否需要使用签名文件发送证书,以便对方可以使用公钥来验证签名。如果是这样,这会引起另一个问题:其他人是否可以从附加的证书中获取私钥来编辑文件并再次签名?这样做的正确方法是什么?
答案 0 :(得分:0)
要验证您使用发布/私钥对创建的签名,另一方只需要您的公钥。你应该始终保护你的私钥,永远不要让它脱身,或者恶意方可以假装你。
使用X509Certificate2
,您可以使用GetPublicKeyString
方法获取十六进制字符串,并以文本格式将其传递给它们。您也可以简单地使用“导出”和“导入”方法仅交换公钥。
PGP的工作原理完全相同,但假设公钥通过单独的可信频道进行交换(例如物理会议和USB记忆棒交换),以便收件人知道公钥是真实的而不是假的。如果您使用来自CA的证书,则CA签名链将为您提供尽可能好的学位信任。
Export
和Import
的代码示例:
var cspSig = (RSACryptoServiceProvider)cert.PrivateKey;
var sig = cspSig.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
var pubKeyBytes = cert.Export(X509ContentType.Cert);
// either send the client the bytes, or the cert file ...
File.WriteAllBytes("MyCert.cer", pubKeyBytes);
并在客户端......
var pubCert = new X509Certificate2();
pubCert.Import(pubKeyBytes);
var cspVer = (RSACryptoServiceProvider)pubCert.PublicKey.Key;
var isValid = cspVer.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sig);
var hasPrivateKey = pubCert.HasPrivateKey; // will equal false if using .Export(X509ContentType.Cert)