C# .NET RSA数据签名,我的假设正确吗?
我一直在深入研究.NETC# .NET RSA数据签名,我的假设正确吗?,c#,rsacryptoserviceprovider,C#,Rsacryptoserviceprovider,我一直在深入研究.NETSystem.Security.Cryptography名称空间,特别是rsacyptoserviceprovider类。它有两种用于签名数据的方法,SignHash()和VerifyHash(),关于这个类和方法的用法,我有几个问题 1)实例化时,rsacyptoserviceprovider创建密钥对,如下所示: // 1 = RSA compatible. http://msdn.microsoft.com/en-us/library/1dh4wac4.aspx C
System.Security.Cryptography
名称空间,特别是rsacyptoserviceprovider
类。它有两种用于签名数据的方法,SignHash()
和VerifyHash()
,关于这个类和方法的用法,我有几个问题
1)实例化时,rsacyptoserviceprovider
创建密钥对,如下所示:
// 1 = RSA compatible. http://msdn.microsoft.com/en-us/library/1dh4wac4.aspx
CspParameters cspParams = new CspParameters( 1 );
cspParams.Flags = CspProviderFlags.NoFlags;
rsa = new RSACryptoServiceProvider( 2048, cspParams ); // rsa is a class member
rsa.PersistKeyInCsp = false;
然后,可以使用以下代码将私钥和公钥保存到磁盘:
public void WriteKeys( FileInfo file, bool includePrivateKey )
{
using( FileStream fs = new FileStream( file.FullName, FileMode.Create, FileAccess.Write, FileShare.None ) ) {
string xml = rsa.ToXmlString( includePrivateKey );
byte[] b = Encoding.UTF8.GetBytes( xml );
string base64 = Convert.ToBase64String( b );
b = Encoding.UTF8.GetBytes( base64 );
fs.Write( b, 0, b.Length );
fs.Close();
}
}
Q:是否有任何措施可以防止以后使用以下代码在客户端计算机上加载公钥(免除文件访问权限等):
private void ReadKeyFromFile( FileInfo keyFile )
{
byte[] b = File.ReadAllBytes( keyFile.FullName );
string base64 = Encoding.UTF8.GetString( b );
byte[] b = Convert.FromBase64String( base64 );
string xml = Encoding.UTF8.GetString( b );
rsa.FromXmlString( xml );
}
Q:如果指定Csp标志CspProviderFlags.UseArchivableKey而不是CspProviderFlags.None,则文件加载失败(在rsa.FromXmlString()处),出现加密异常“指定的标志无效”,这是为什么?“可实现的”听起来就像我想要什么,不是吗
Q:是否可以创建RSACryptoServiceProvider
,而不创建新的密钥对(因为我很快就会加载现有密钥)
2)根据MSDN,可以使用SignHash
和VerifyHash
两种方法,使用私钥对一些任意数据的哈希进行签名,然后使用公钥进行验证,以确保数据的有效性
Q:如果我将公钥与我的应用程序(嵌入式资源或base64编码字符串等)一起分发,以验证使用私钥散列和签名的许可证密钥,我是否可以确定没有其他人可以生成应用程序认为有效的许可证密钥(假设我将私钥保持为私钥)?毕竟,这就是公钥/私钥的用途,不是吗
签名代码示例:
using( SHA1 sha = SHA1.Create() ) {
byte[] hash = sha.ComputeHash( data );
byte[] signature = rsa.SignHash( hash, CryptoConfig.MapNameToOID( "SHA1" ) );
}
提前感谢。攻击者只需反编译您的代码并插入自己的公钥即可。1中有很多问题。不要担心(额外的)生成密钥后,您拥有加载/保存/创建密钥的所有工具。您对签名过程的看法是正确的,但就像@slaks评论为许可证一样,这是硬纸板门上的一把重锁。当然,是的。这是任何软件的问题,无论语言如何。即使混淆代码和加密公钥也不会是100%正确的对付坚决的攻击者;他们甚至可以禁用整个验证,这可能会更容易。现在,我的问题不是关于黑客可以做什么或不能做什么,而是关于加密机制。因为你不了解公钥的用途。它是提供给想用它来验证密钥来源的人消息。许可证黑客不会想要它,这使得它对你认为你想使用它的人毫无用处。不,谢谢。不感兴趣。攻击者可以简单地反编译你的代码并插入自己的公钥。1中有很多问题。不要担心(额外的)生成密钥后,您拥有加载/保存/创建密钥的所有工具。您对签名过程的看法是正确的,但就像@slaks评论为许可证一样,这是硬纸板门上的一把重锁。当然,是的。这是任何软件的问题,无论语言如何。即使混淆代码和加密公钥也不会是100%正确的对付坚决的攻击者;他们甚至可以禁用整个验证,这可能会更容易。现在,我的问题不是关于黑客可以做什么或不能做什么,而是关于加密机制。因为你不了解公钥的用途。它是提供给想用它来验证密钥来源的人许可证黑客不会想要它,这使得它对你认为你想使用它的人毫无用处。不,谢谢。不感兴趣。