• 【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。

    ===================================================

    看看运行结果。

    如果前后输入的内容相同,验证就会成功,如果前后输入的内容不同,验证就会失败。

    示例代码下载

  • 相关阅读:
    关于一些无法被代替的宏定义函数
    error in invoking target 'mkldflags ntcontab.o nnfgt.o' of makefile
    ajax——XMLHttpRequest
    Readprocessmemory使用方法
    互信息的概念和定理
    音频编辑大师 3.3 注册名称 许可证
    youwuku和koudaitong以及weimeng差异
    delphi webbrowser 经常使用的演示样本
    大约ActionContext.getContext()使用体验
    Codeforces Round #243 (Div. 1)——Sereja and Two Sequences
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/4757086.html
Copyright © 2020-2023  润新知