在进行RSA2进行验签的时候,报了以下错误:

java.security.SignatureException: Signature length not correct: got 344 but was expecting 256
at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:189)
at java.security.Signature$Delegate.engineVerify(Signature.java:1192)
at java.security.Signature.verify(Signature.java:626)

翻译成中文的意思是:java.security.signatureException:签名长度不正确:得到344,但期望256

问题原因是:

  在生成签名的时候,用的是 Base64.encodeBase64String(signByte) 成签名字符串。

     /**
* 生成签名字符串.
* @param encryptStr
* @return
* @throws Exception
*/
private static String generateSignByRsa(String encryptStr) throws Exception {
if (logger.isInfoEnabled()) {
logger.info("生成Rsa签名字符串...");
} // 用商户私钥生成签名字符串
RsaEncrypt rsaEncrypt = new RsaEncrypt();
rsaEncrypt.loadPrivateKey(MpayConfig.signMap.get(MpayConfig.PRIVATE_KEY));
byte[] signByte = rsaEncrypt.sign(encryptStr, rsaEncrypt.getPrivateKey());
String reqSign = Base64.encodeBase64String(signByte);
logger.info("Rsa签名字符串:" + reqSign);
return reqSign;
}

  在验签的时候,直接getBytes方法返回字节数据,这样就导致签名字符串长度不一致了。

   RsaEncrypt rsaEncrypt=new RsaEncrypt();
  rsaEncrypt.loadPublicKey(publicKey);
  return rsaEncrypt.verifySign(content,sign.getBytes(RsaEncrypt.ENCODING),rsaEncrypt.getPublicKey());

解决方案:

  正确的方式应该是,获取签名字符串字节数组时,跟签名时保持一样,用Base64Util.decode(sign)方法来获取

     RsaEncrypt rsaEncrypt=new RsaEncrypt();
rsaEncrypt.loadPublicKey(publicKey);
byte[] signByte = Base64Util.decode(sign);
return rsaEncrypt.verifySign(content,signByte,rsaEncrypt.getPublicKey());

Rsa2验签报错【java.security.SignatureException: Signature length not correct】的解决办法的更多相关文章

  1. 抓取https网页时,报错sun.security.validator.ValidatorException: PKIX path building failed 解决办法

    抓取https网页时,报错sun.security.validator.ValidatorException: PKIX path building failed 解决办法 原因是https证书问题, ...

  2. 关于报错The specified child already has a parent的解决办法

    报错信息为:java.lang.IllegalStateException: The specified child already has a parent. You must call remov ...

  3. 开启bin-log日志mysql报错:This function has none of DETERMINISTIC, NO SQL解决办法

    开启bin-log日志mysql报错:This function has none of DETERMINISTIC, NO SQL解决办法: 创建存储过程时 出错信息: ERROR 1418 (HY ...

  4. VUE.JS 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property 'xxxx' of undefined 的解决办法

    正常情况下在data里面都有做了定义 在函数里面进行赋值 这时候你运行时会发现,数据可以请求到,但是会报错 TypeError: Cannot set property 'listgroup' of ...

  5. composer 报错:Failed to decode response: zlib_decode(): data error 解决办法

    执行命令 composer require particle/validator 报错 Failed to decode response: zlib_decode(): data error 网上推 ...

  6. 服务器重启报错:提示fstab readonly报错!( /etc/fstab 只读无法修改的解决办法)

    摘自:http://blog.csdn.net/gray13/article/details/7432866 一.问题描述:服务器重启报错:提示fstab readonly报错! 二.问题原因:挂载的 ...

  7. VS 2015 报错 " 'unistd.h': No such file or directory" 的解决办法

    使用 Visual Studio 2015 进行程序开发工作时,如果编译的是来自于Linux平台的源文件,该源文件可能会包含头文件 uninstd.h,这样会产生报错信息: "fatal e ...

  8. Pycharm中不支持中文编码的解决方案。Pycharm中文报错。 Pycharm出现的部分快捷键无效及解决办法

    Pycharm中不支持中文编码的解决方案.Pycharm中文报错. 1. 打开Pycharm ---->  File ----> Default setting ------> Ed ...

  9. Atom | 报错 Cannot load the system dictionary for zh-CN的解决办法

    文章目录 问题描述 推荐阅读 查找问题所在 解决方案 (二选一) 问题描述 最近这款优秀的编辑器 atom,报错 Cannot load the system dictionary for zh-CN ...

随机推荐

  1. C++学习--第一个程序

    C++控制台应用程序 我们创建一个包含预编译头的C++控制台应用程序时,会发现其结构是这样的: 1)理解预编译头文件: 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件( ...

  2. 编写高质量代码改善C#程序的157个建议——建议132:考虑用类名作为属性名

    建议132:考虑用类名作为属性名 一般来说,若果属性对应一个类型,应该直接用类型名命名属性名.如下: class Person { public Company Company { get; set; ...

  3. Application.DoEvent和定时刷新控件

    我们写一个textbox,让其依循环递增,但每次都会出现假死现象,等循环结束后,变为最终值.今天总结一下: private void button3_Click(object sender, Even ...

  4. centos7 安装dnf包管理器和常用命令

    Installing DNF Currently the DNF package comes from the EPEL repository, so if your Linux system is ...

  5. 解决SqlServer 2005 sa帐户不能登录问题

    允许 sa 用户远程是很危险的.推荐的做法是在本地新建一个允许远程连接的用户. 1.启用TCP/IP协议. 2.配置监听端口(1433). net -an 检查本地端口是否建立监听,使用 在线IP端口 ...

  6. Oracle 下载安装教程(doc文件)

    之前一直没有怎么接触Oracle数据库,最近公司有个项目中需要用到,所以开始折腾Oracle.刚开始走了很多弯路,为了帮助更多和我一样刚开始接触Oracle的小白,我理了一下的思路 下载地址(需要登录 ...

  7. SQLlite 分页

    如果我要去11-20的Account表的数据 Select * From Account Limit 9 Offset 10; 以上语句表示从Account表获取数据,跳过10行,取9行 嗯,我觉得这 ...

  8. C#中数组作为参数传递的问题

    原则:尽可能控制对数据的修改,如果可以预测某个数据不会或不应该被改变,就要对其控制,而不要期望使用这个数据的调用者不会改变其值. 如果参数在使用过程中被意外修改,将会带来不可预知的结果,而且这种错误很 ...

  9. RabbitMq初探——Hello World

    HelloWorld 前言 这里我们弱化broker内部构造.将整体分为三部分. P:producer.生产者. C:Consumer.消费者. queue:队列. 后面的代码都依赖于 the php ...

  10. dataframe去重 drop_duplicates

    data.drop_duplicates() #默认:data中一行元素全部相同时才去除 data.drop_duplicates(['a','b'])#data根据’a','b'组合列删除重复项,默 ...