-
2021-04-02 10:49:20
公私钥生成方法,请见前文
实例:python生成数字签名及验证
import base64 from Crypto.Hash import SHA256 from Crypto.PublicKey import RSA from Crypto.Signature import pkcs1_15 # 签名消息 message = "action=xx&contract_no=xx&offer_id=xx&product_id=xx&OjJNgXdJxAVDeSNEUhi4ANNCQmtYHFN1" def ras_en(privateKey_file): """使用私钥生成数字签名""" with open(privateKey_file, 'r') as f: h = SHA256.new(message.encode("utf-8")) print(h.hexdigest()) key = RSA.importKey(f.read()) signer = pkcs1_15.new(key).sign(h) signature = base64.b64encode(signer) print(signature.decode('utf-8')) return signature def verify_key(publicKey_file, signature): """使用公钥验证数字签名""" with open(publicKey_file, 'r') as f: h = SHA256.new(message.encode("utf-8")) key = RSA.importKey(f.read()) try: pkcs1_15.new(key).verify(h, base64.b64decode(signature)) print("The signature is valid.") except (ValueError, TypeError): print("The signature is not valid.") def main(): private_file = 'private.rsa' public_file = 'public.rsa' signature = ras_en(private_file) verify_key(public_file, signature) if __name__ == '__main__': main()
更多相关内容 -
php 生成签名及验证签名详解
2020-10-21 05:51:39主要介绍了php 生成签名及验证签名详解的相关资料,需要的朋友可以参考下 -
基于openssl的RSA的加密,解密,签名和验证签名
2017-09-20 10:02:08基于openssl的RSA的加密,解密,签名和验证签名, RSR加密 RSA解密 openssl签名 openssl验签, 基于openssl的RSA的加密,解密,签名和验证签名 -
PHP开发API接口签名生成及验证操作示例
2020-10-15 06:43:47主要介绍了PHP开发API接口签名生成及验证操作,结合实例形式较为详细的分析了PHP开发API接口签名生成及验证操作相关原理、实现方法与操作注意事项,需要的朋友可以参考下 -
微信APP支付验证签名失败
2021-01-28 11:23:34微信APP支付验证签名失败 如果在Android及IOS端出现签名失败,可以通过以下方式解决: 1、后端延签成功,但是APP端始终签名失败,这很可能是微信支付SDK新版本问题,在APP端将Sgin参数设置为 “MD5”,而不是后端...微信APP支付验证签名失败
如果在Android及IOS端出现签名失败,可以通过以下方式解决:
1、后端延签成功,但是APP端始终签名失败,这很可能是微信支付SDK新版本问题,在APP端将Sgin参数设置为 “MD5”,而不是后端返回的paySgin值。
2、如果上面还不行,需要将 商户的 API密码和APIV3密码都重置下
3、微信提供的后端SDK中的WXPay.java类中以下代码调整为MD5
https://developers.weixin.qq.com/community/develop/article/doc/000c0e3ac880f0488d1bc530355c13
另外不得不吐槽下微信支付的帮助文档太差,导致接入支付时候要走很多弯路!!
另外不得不感谢网友将解决问题结果共享到网上!
-
智能合约验证签名
2018-04-15 20:22:41同时,智能合约编程语言solidity 也提供了签名和验证签名的操作:1、签名签名使用web3.eth.sign(),比如利用web3.js:var account = web3.eth.accounts[0]; var sha3Msg = web3.sha3("blockchain"); var signedData以太坊(ethereum)中使用了
ECDSA
签名算法,该算法基于椭圆曲线实现。
同时,智能合约编程语言solidity
也提供了签名和验证签名的操作:1、签名
签名使用
web3.eth.sign()
,比如利用web3.js
:var account = web3.eth.accounts[0]; var sha3Msg = web3.sha3("blockchain"); var signedData = web3.eth.sign(account, sha3Msg);
但是需要注意的是
geth
客户端签名比较特殊,下面是以太坊签名函数:sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))
从上述代码可以看出,
geth
会为要签名的消息加上"\x19Ethereum Signed Message:\n" + len(message)
前缀,所以实际上真正的被签名的数据并不是message
的哈希值,而是message
的哈希值加上前缀后再次哈希的值。我们要非常注意这一点,否则后期验证签名会不成功。2、验签
验证签名可以在智能合约中通过
ecrecover()
函数实现,ecrecover()
函数如下:ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)
从代码中可以看出,
ecrecover()
函数有四个参数,被签名数据的哈希值hash
,以及签名结果划分的r
,s
,v
三个值,即r
,s
,v
是分别来自签名结果串signature
,比如:signature = 0x1a0744724beca14bfd7b5f838394a3e5c49c4872dbd1fbc29661ffd88bed14ad53e045268098d7934530e81c058d40b763381f8d5c75fd29b4300e64be75867401 r = signature[0:64] = 0x1a0744724beca14bfd7b5f838394a3e5c49c4872dbd1fbc29661ffd88bed14ad s = signature[64:128] = 0x53e045268098d7934530e81c058d40b763381f8d5c75fd29b4300e64be758674 v = signature[128:130] = 0x01
这里需要特别注意另一参数被签名数据的哈希值
hash
,比如要签名的数据是blockchain
,哈希值为:sha3Msg = web3.sha3("blockchain") = 0x1a0744724beca14bfd7b5f838394a3e5c49c4872dbd1fbc29661ffd88bed14ad53e045268098d7934530e81c058d40b763381f8d5c75fd29b4300e64be75867401
但是如果把
sha3Msg
作为参数的话,恢复出的公钥地址并不是原来的进行签名的公钥地址,这就是前面提到的签名函数参数前缀问题,所以ecrecover()
函数中的hash
参数应该为:sha3Msg = web3.sha3("blockchain"); hash = web3.sha3(sha3Msg);
附录
VerifySignature.sol文件
pragma solidity ^0.4.10; contract VerifySignature{ //数据验签入口函数 function verifyByHashAndSig(bytes32 hash, bytes signature) returns (address){ bytes memory signedString = signature; bytes32 r = bytesToBytes32(slice(signedString, 0, 32)); bytes32 s = bytesToBytes32(slice(signedString, 32, 32)); byte v1 = slice(signedString, 64, 1)[0]; uint8 v = uint8(v1) + 27; return ecrecoverDirect(hash, r, s, v); } //将原始数据按段切割出来指定长度 function slice(bytes memory data, uint start, uint len) returns (bytes){ bytes memory b = new bytes(len); for(uint i = 0; i < len; i++){ b[i] = data[i + start]; } return b; } //bytes转换为bytes32 function bytesToBytes32(bytes memory source) returns (bytes32 result) { assembly { result := mload(add(source, 32)) } } //使用ecrecover恢复公匙 function ecrecoverDirect(bytes32 hash, bytes32 r, bytes32 s, uint8 v) returns (address addr){ /* prefix might be needed for geth only * https://github.com/ethereum/go-ethereum/issues/3731 */ bytes memory prefix = "\x19Ethereum Signed Message:\n32"; hash = sha3(prefix, hash); addr = ecrecover(hash, v, r, s); } }
或者直接写为一个函数
function ecrecovery(bytes32 hash, bytes sig) public returns (address) { bytes32 r; bytes32 s; uint8 v; if (sig.length != 65) { return 0; } assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := and(mload(add(sig, 65)), 255) } // https://github.com/ethereum/go-ethereum/issues/2053 if (v < 27) { v += 27; } if (v != 27 && v != 28) { return 0; } /* prefix might be needed for geth only * https://github.com/ethereum/go-ethereum/issues/3731 */ // bytes memory prefix = "\x19Ethereum Signed Message:\n32"; // hash = sha3(prefix, hash); return ecrecover(hash, v, r, s); }
VerifySignature.js测试文件
var VerifySignature = artifacts.require("./VerifySignature.sol"); contract('VerifySignature', function(accounts) { console.log(accounts); it("verify signature 成功!", function(done) { var account = accounts[0]; var sha3Msg = web3.sha3("blockchain"); /* console.log('1 '+ web3.sha3(web3.toHex('blockchain'))); //0x948100b2466113dfb2b67ab686395aaf8935c612cc5316c01e30b5b354b646c9 console.log('2 '+ web3.sha3(web3.toHex('blockchain'),{encoding:'hex'})); //0x7ee156df5091fbef71b96557542210a9c9ca851cc85aaf60026519b4aaccf491 console.log('3 '+ web3.sha3('blockchain')); //0x7ee156df5091fbef71b96557542210a9c9ca851cc85aaf60026519b4aaccf491 console.log('4 '+ web3.sha3( unescape(encodeURIComponent('blockchain')) ) ); //to UTF8 //0x7ee156df5091fbef71b96557542210a9c9ca851cc85aaf60026519b4aaccf491 console.log('5 '+ web3.sha3( unescape(encodeURIComponent('blockchain')), {encoding:'hex'} ) ); //to UTF8 //0x2f1437634f08e2b6324e0701d49075e39cfc34c1fca7c5111dc07b8150399176 */ var signedData = web3.eth.sign(account, sha3Msg); console.log("account: " + account); console.log("sha3(message): " + sha3Msg); console.log("Signed data: " + signedData); VerifySignature.new({ from: accounts[1] }).then(function(verifySignature) { verifySignature.verifyByHashAndSig.call(sha3Msg, signedData).then(function (addr) { console.log(" addr = %s", addr); assert.equal(addr, account, "Address doesn't match!") return verifySignature.verifyByHashAndSig(sha3Msg, signedData); //return VerifySignature.verifyConsumerSignature.call(); }).then( function (txid) { console.log(" verifySignature, txid = %s, mined at #%s block", txid.tx, txid.receipt.blockNumber);//txid is a object contains tx, receipt, logs. Can print ("%x", txid) to check. var sig = signedData.slice(2) var r = `0x${sig.slice(0, 64)}` var s = `0x${sig.slice(64, 128)}` var v = web3.toDecimal(sig.slice(128, 130)) + 27 return verifySignature.ecrecoverDirect.call(sha3Msg, r, s, v); }).then(function (addr) { console.log(" DirectAddr = %s", addr); assert.equal(addr, account, "Address doesn't match!") done(); // to stop these tests earlier, move this up }).catch(done); }).catch(done); }); });
参考文献
1、区块链语言Solidity校验椭圆曲线加密数字签名(附实例)
2、workflow on signing a string with private key, followed by signature verification with public key
3、Signing in geth and verifying in solidity do not produce correct results -
uni 微信支付出现支付验证签名失败
2021-01-21 17:57:49uni 在app中支付出现验证签名失败 安卓正常 IOS出现这个问题 经过对照其他参数 排查到 IOS接收时间戳只能接收10位 最终 左边为正常参数返回 这个为问题参数返回 提示的错误信息 下面为支付的代码 // 获取商品列表...uni 在app中支付出现验证签名失败 安卓正常 IOS出现这个问题
经过对照其他参数 排查到 IOS接收时间戳只能接收10位 最终
左边为正常参数返回
这个为问题参数返回
提示的错误信息
下面为支付的代码
// 获取商品列表 async getVipList() { const { data: res } = await uni.$http.get('/commodity', { userId: this.user.id, commodityType: this.vipType }) console.log(res.data, '获取商品信息'); if (res.code !== '0') return uni.$showMsg('获取商品失败') this.vipList = res.data }, // 选择商品 pay(number) { console.log(number, '打印的') this.number = number }, // 获取订单编号 async getNumberList() { let that = this const { data: res } = await uni.$http.post('/memberOrder/purchaseMember?commodityNumber=' + this.number, { commodityNumber: this.number }) if (this.tonsesName == '微信') { console.log('微信支付'); return this.getMemberPay(res.orderNumber) } if (this.tonsesName == '支付宝') { return this.zhifubaoPay(res.orderNumber) } if (this.tonsesName == '苹果支付') { console.log("ioszhifu : "); return this.iosPay(res.orderNumber) } if (this.tonsesName == '余额支付') { this.balancePayment(res.orderNumber) } }, // 这里仅仅演示微信支付 // 获取支付需要的参数 async getMemberPay(orderNumber) { const { data: res } = await uni.$http.post('/memberPay/wxPay?orderNumber=' + orderNumber + '&type=WX_APP', {}) console.log(res, '打印的res'); uni.requestPayment({ provider: 'wxpay', orderInfo: JSON.stringify(res.data), //微信、支付宝订单数据 success: function(res) { console.log('success:' + JSON.stringify(res)); }, fail: function(err) { console.log('这里是微信支付', res.data); console.log('fail:' + JSON.stringify(err)); } }); },
好了 到这里就结束了 谢谢大家捧场
-
微信小程序支付 参数异常 及 验证签名失败 总结
2019-07-18 10:00:51看源码发现官方工具类默认就是按照MD5加密的,所以我一直以为不需要添加签名方式,因为调用接口时数据签名也未添加签名方式,此处一定区分开,否则把数据发送给前端调用会发生验证签名失败。 代码如下: /... -
API接口对接生成签名与验证签名
2018-11-01 18:35:29API接口生成签名与验证签名思路,本文只提供生成签名的思路和验证签名的思路,不喜勿碰 -
微信支付JSAPI报支付验证签名失败
2020-08-05 17:48:103.如果验证签名工具和你生成的签名一致,并且还是提示支付验证签名失败,那么你可以看看验证类型,因为JSAPI调起支付需要和统一下单预支付验证方式是一样的,官方的javasdk里预支付使用的是HMACSHA256,而JSAPI默认... -
微信 requestPayment 支付验证签名失败 paySign
2019-07-10 17:25:54我在做微信公众号支付开发 统一下单的prepay_id我已经正常取到了,但是在H5页面调起微信支付后始终返回 支付验证签名失败 ,但是 我在签名校验工具中 生成的签名和我的也一致 ,实在不知道... -
Python-Api签名验证样例
2019-08-10 19:45:28Api签名验证样例 -
C#RSA加密解密签名和验证签名的小例子
2012-12-09 00:05:52C#RSA加密解密签名和验证签名的小例子,代码都加了注释,可以很容易看懂.如果应用到消息收发,发送方用公钥加密,接收方用私钥解密.如果是应用到软件注册方面,则需要客户端保留公钥,程序开发者保留私钥.使用签名和验证... -
抵抗共谋攻击的服务器辅助验证签名方案 (2016年)
2021-05-18 13:41:47为了使服务器辅助验证算法一次能够验证由不同私钥签名的多个消息,运用聚合签名的思想提出了一个基于聚合签名的服务器辅助验证方案,由服务器执行验证算法中计算代价大的对运算,有效地减少了算法验证阶段的计算量。... -
支付验证签名失败
2018-07-13 10:01:34支付验证签名失败 微信支付的时候参数传的都是后台返回的数据,安卓的能用而ios的就是提示【支付验证签名失败】,然后就是支付不能成功。 本人也经历了好长时间,我就先不做这里的。之后就下去查资料看官方文档也... -
java RSA2 加密、解密 、签名和验证签名
2020-05-14 17:24:58} //公钥验证签名 base64签名 signature 签名内容requestData public static boolean verifySign(String requestData, String signature){ boolean verifySignSuccess = false; try { PublicKey publicKey = ... -
小程序支付的时候出现“支付验证签名失败”
2018-09-20 14:38:54小程序支付的时候出现“支付验证签名失败”,在微信支付接口签名验证工具检查是正确的 解决方案; 在开发微信小程序支付的时候 统一下单签名是正常的,能正常获取到prepayid。 用同样的方法做二次签名,每次支付小... -
Java PDF数字签名(二) - 验证签名有效性
2018-10-25 16:29:46上一篇文章介绍了如何在Java中给PDF文档添加数字签名,这篇文章接着介绍如何验证数字签名的有效性。 步骤: 1.创建一个Java project,并添加一个class VerifySignature.JAVA 2.下载Free Spire.PDF for JAVA包并解... -
微信服务商统一下单吊起微信支付报错:“支付验证签名失败”
2019-11-14 21:00:111.检查签名是否能通过“微信支付接口签名校验工具”:...2.统一下单接口需要对签名进行二次签名后才可供吊起微信支付接口使用 //二次签名只需如下参数即可 MD5.Encode( "appId=" + sub_appid + "&nonceStr... -
支付宝支付验证签名失败
2019-09-09 15:00:34我使用了支付宝提供的源代码接入支付宝网页支付后,发现在return_url方法中验证签名不会乱码,但是到了notify_url中验证签名就会提示验证签名失败! 解决方法 其实是不够仔细阅读支付宝提供源码导致的,在它的源代码... -
微信小程序支付踩的坑(支付验证签名失败)
2019-11-27 14:18:39微信小程序支付踩的坑(支付验证签名失败) 最近有需求是微信小程序支付,用的是微信自带的sdk,曾做过微信APP支付,微信扫用户码支付,都是OK的,现在把做微信小程序支付流程写下来,还有在调用过程踩的坑,下面为... -
MD5withRSA签名和验证签名(php>5.5)
2017-12-06 23:50:10MD5withRSA签名和验证签名(php>5.5)MD5withRSA签名和验证签名(php>5.5) -
再谈微信小程序支付(jsapi)报错:支付验证签名失败
2020-07-02 22:47:10有个小程序内支付的功能,本来一直好好的,突然不行了,提示支付验证失败。但是小程序另一处也有支付功能是可以支付的。是在难于理解。 解决办法 于是网上各种搜索,大部分说是appid要改成appId(注意大小写),也... -
API接签名验证
2018-08-01 09:49:59http Restful API接签名验证 ,防API接口进行在公网裸奔 -
服务商模式下微信小程序支付时,一直报“支付验证签名失败”错误的解决办法
2019-07-10 11:52:43在写小程序支付的时候,我是以服务商模式发起的支付,统一下单接口是调用成功的,但是在小程序调起支付的时候就报“支付验证签名失败”的错误。 主要有三个原因: 1、第二次签名用到的timeStamp要是字符串格式。 2、... -
论文研究-抵抗共谋攻击的服务器辅助验证签名方案.pdf
2019-07-22 19:38:48为了使服务器辅助验证算法一次能够验证由不同私钥签名的多个消息,运用聚合签名的思想提出了一个基于聚合签名的服务器辅助验证方案,由服务器执行验证算法中计算代价大的对运算,有效地减少了算法验证阶段的计算量。... -
微信小程序JSAPI支付-参数异常以及验证签名失败总结
2019-02-14 13:22:21,看源码发现官方工具类默认就是按照MD5加密的,所以我一直以为不需要添加签名方式,因为调用接口时数据签名也未添加签名方式,此处一定区分开,否则把数据发送给前端调用会发生验证签名失败。 代码如下: //... -
微信 沙箱验证签名失败 请确认沙箱签名key是否正确 解决办法
2019-05-13 11:44:11沙箱验证签名失败,请确认沙箱签名key是否正确(通过getsignkey调用生成) 微信支付调试步骤 获取沙箱的sandbox_signkey,地址是https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey 将对应的url改成... -
微信公众号支付choosewxpay:fail,支付验证签名失败
2016-12-03 01:49:35这里微信验证签名已通过  添加测试目录 ------------------------------------------ 1.页面已经通过验证,可以有支付... -
微信支付-支付验证签名失败
2019-07-13 13:11:39弹框提示“支付验证签名失败” 签名生成规则: 根据key值字典排序,用=拼接,再拼接api密钥,加密并转大写。 检查paySign的签名参数没有问题。 后排查找到原因:prepay_id生成时的签名类型和paySign生成的签名类型...