对数据进行签名和验证,是为了防止数据被“盗版”。比较常规的做法是通过公钥进行验证。

算法上多用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应用开发】签名与验证的更多相关文章

  1. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  2. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  3. RSA加密解密及RSA签名和验证及证书

    RSA加密解密及RSA签名和验证及证书 公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密 ...

  4. WebApi基于Token和签名的验证

    最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...

  5. Java 程序的打包、签名和验证

    参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找到这个总入口 Java SE 8 Document ...

  6. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  7. 使用openssl实现ECDSA签名以及验证功能(附完整测试源码)

    突然找到数年前写的这段代码,当是因为对密码学几乎不怎么了解踩了一些坑,现在开源出来方便大家直接利用. ECDSA的全名是Elliptic Curve DSA,也就是椭圆曲线DSA,由于椭圆曲线的复杂性 ...

  8. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  9. Xamarin Anroid开发教程之验证环境配置是否正确

    Xamarin Anroid开发教程之验证环境配置是否正确 经过前面几节的内容已经把所有的编程环境设置完成了,但是如何才能确定所有的一切都处理争取并且没有任何错误呢?这就需要使用相应的实例来验证,本节 ...

随机推荐

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. tLinux 2.2下安装Mono 4.8

    Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...

  3. Sublime配置python开发环境

    Package Control Package Control 是Sublime 里直接安装附加插件的包管理器.可以通过以下步骤手动安装: 1.点击Preferences > Browse Pa ...

  4. 【深入Java虚拟机】之四:类加载机制

    类加载过程     类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下图所示: 其中类加载的过程包括了加载.验 ...

  5. beans.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. win10上部署Hadoop-2.7.3——非Cygwin、非虚拟机

    开始接触Hadoop,听人说一般都是在Lunix下部署Hadoop,但是本人Lunix不是很了解,所以Google以下如何在Win10下安装Hadoop(之后再在Lunix下弄),找到不少文章,以下是 ...

  7. Android Studio开发RecyclerView遇到的各种问题以及解决(二)

    开发RecyclerView时候需要导入别人的例子,我的是从github导入的,下载下github的压缩包之后解压看你要导入的文件是priject还是Module.(一般有app文件夹的大部分是pro ...

  8. iOS在导航栏上居中显示分段控件(UISegmentedControl)

    UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:nil]; segmentedCont ...

  9. JavaScript中undefined与null的区别

    通常情况下, 当我们试图访问某个不存在的或者没有赋值的变量时,就会得到一个undefined值.Javascript会自动将声明是没有进行初始化的变量设为undifined. 如果一个变量根本不存在会 ...

  10. centos6.X使用Apache+Mono搭建asp.net 环境

    mark 一下时间  2016年1月19日09:42:49 mono是指由Novell公司(由Xamarin发起,并由Miguel de lcaza领导的,一个致力于开创·NET在Linux上使用的开 ...