【Win10应用开发】签名与验证
对数据进行签名和验证,是为了防止数据被“盗版”。比较常规的做法是通过公钥进行验证。
算法上多用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。
===================================================
看看运行结果。
如果前后输入的内容相同,验证就会成功,如果前后输入的内容不同,验证就会失败。
相关文章
- Flink 实践教程-入门(6):读取 PG 数据写入 ClickHouse
- [GPIO]推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置
- MySQL必知必会汇总
- 基于天河超级计算机的新冠药物筛选成果入围国际戈登贝尔奖评选
- Nucleic Acids Research | 药物转运体三维结构可变性信息分析
- 问题解决:C++ 读取MySQL数据库中文乱码问题
- Flink 实践教程-入门(7):消费 Kafka 数据写入 PG
- 张青林:云原生数据库TDSQL-C在关键技术的多维突破
- 多类型数据库统一管理,腾讯云数据库DBhouse工具重磅发布
- 针对EasyNVR开发的EasyStreamClientTool调试工具如何使用?
- 64最小路径和----动态规划
- 向量类模板的声明和实现---扩充版本
- 62 leetcode 不同路径---动态规划
- leetcode 53. 最大子序和
- leetcode 面试题 17.16. 按摩师
- c++之iostream迭代器用法超详细整理!!!
- Spark性能优化和故障处理
- c++IO库之string流超详细整理,建议赶紧收藏! ! !
- ClickHouse深度解析,收藏这一篇就够了~
- 消除业务跨国数据传输隐患,APISIX 在网关层的解法