【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();
另外,你还可以以公钥的形式导出,这样方便存储。
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。
===================================================
看看运行结果。

如果前后输入的内容相同,验证就会成功,如果前后输入的内容不同,验证就会失败。
【Win10应用开发】签名与验证的更多相关文章
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- RSA加密解密及RSA签名和验证及证书
RSA加密解密及RSA签名和验证及证书 公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密 ...
- WebApi基于Token和签名的验证
最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...
- Java 程序的打包、签名和验证
参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找到这个总入口 Java SE 8 Document ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- 使用openssl实现ECDSA签名以及验证功能(附完整测试源码)
突然找到数年前写的这段代码,当是因为对密码学几乎不怎么了解踩了一些坑,现在开源出来方便大家直接利用. ECDSA的全名是Elliptic Curve DSA,也就是椭圆曲线DSA,由于椭圆曲线的复杂性 ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...
- Xamarin Anroid开发教程之验证环境配置是否正确
Xamarin Anroid开发教程之验证环境配置是否正确 经过前面几节的内容已经把所有的编程环境设置完成了,但是如何才能确定所有的一切都处理争取并且没有任何错误呢?这就需要使用相应的实例来验证,本节 ...
随机推荐
- Tcp/ip 报文解析
在编写网络程序时,常使用TCP协议.那么一个tcp包到底由哪些东西构成的呢?其实一个TCP包,首先需要通过IP协议承载,而IP报文,又需要通过以太网传送.下面我们来看看几种协议头的构成 一 .Ethe ...
- 在离线环境中使用.NET Core
在离线环境中使用.NET Core 0x00 写在开始 很早开始就对.NET Core比较关注,一改微软之前给人的印象,变得轻量.开源.跨平台.最近打算试着在工作中使用.但工作是在与互联网完全隔离的网 ...
- hash表长度优化证明
hash表冲突的解决方法一般有两个方向: 一个是倾向于空间换时间,使用向量加链表可以最大程度的在节省空间的前提下解决冲突. 另外一个倾向于时间换空间,下面是关于这种思路的一种合适表长度的证明过程: 这 ...
- RabbitMq应用一
RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- sql的那些事(一)
一.概述 书写sql是我们程序猿在开发中必不可少的技能,优秀的sql语句,执行起来吊炸天,性能杠杠的.差劲的sql,不仅使查询效率降低,维护起来也十分不便.一切都是为了性能,一切都是为了业务,你觉得你 ...
- jQuery幻灯片插件autoPic
原文地址:Jquery自定义幻灯片插件 插件效果图: 演示地址:autoPic项目地址:autoPic 欢迎批评指正!
- JavaScript实现DOM对象选择器
目的: 根据传入的选择器类型选出第一个符合的DOM对象. ①可以通过id获取DOM对象,例如 $("#adom"); ②可以通过tagName获取DOM对象,例如 $(" ...
- Autofac - 属性注入
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...
- Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...