美文网首页
签名验证不通过

签名验证不通过

作者: 书上有人说 | 来源:发表于2018-12-13 17:20 被阅读0次

先上代码

/**
    * 验证数字签名函数入口
    * @param str 待验签明文
    * @param signBytes  待验签签名后字节数组
    * @param publicKey 验签使用公钥
    * @param signAlgorithm 签名算法
    * @return 验签是否通过
    * @throws ServiceException
    */
   public static boolean verifyDigitalSign(String str, byte[] signBytes, PublicKey publicKey, String signAlgorithm) throws ServiceException {
       byte[] plainBytes = str.getBytes();
       boolean isValid = false;
       try {
           Signature signature = Signature.getInstance(signAlgorithm);
           signature.initVerify(publicKey);
           signature.update(plainBytes);
           isValid = signature.verify(signBytes);
           return isValid;
       } catch (NoSuchAlgorithmException e) {
           throw new ServiceException(String.format("验证数字签名时没有[%s]此类算法", signAlgorithm));
       } catch (InvalidKeyException e) {
           throw new ServiceException("验证数字签名时公钥无效");
       } catch (SignatureException e) {
           throw new ServiceException("验证数字签名时出现异常");
       }
   }

同样的校验内容,在本地正常,生产正常,但是在测试环境上发现无法校验通过,
差异:获取str时,由

StringBuffer data = new StringBuffer();
        if(code==200){
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()));
            String str = "";
            while((str = reader.readLine()) != null){
                data.append(str);
            }
            reader.close();
        }else{
            data.append("远程服务器连接失败,错误代码:").append(code);
        }

改成

StringBuffer data = new StringBuffer();
if(code==200){
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(connection.getInputStream(),"utf-8"));
    String str = "";
    while((str = reader.readLine()) != null){
        data.append(str);
    }
    reader.close();
}else{
    data.append("远程服务器连接失败,错误代码:").append(code);
}

得到的str结果在本地和测试环境也是一样的。但是在调用校验方法时本地通过,测试环境不通过。经最后检查判断,是由于这两个的jdk字符集不一致造成。可以通过Java程序测试jdk的字符集设置。

        System.out.println("Default Charset=" + Charset.defaultCharset());  
        System.out.println("file.encoding=" + System.getProperty("file.encoding"));  
        System.out.println("Default Charset=" + Charset.defaultCharset());  
        System.out.println("Default Charset in Use=" + getDefaultCharSet());  

本地:

Default Charset=UTF-8
file.encoding=UTF-8
Default Charset=UTF-8
Default Charset in Use=UTF8

测试:

Default Charset=GB18030
file.encoding=GB18030
Default Charset=GB18030
Default Charset in Use=GB18030

解决办法

1、所有需要指定字符集的地方,都指定为统一的字符集。
2、修改jdk默认的字符集。这个可以从百度找下。

相关文章

  • 签名验证不通过

    先上代码 同样的校验内容,在本地正常,生产正常,但是在测试环境上发现无法校验通过,差异:获取str时,由 改成 得...

  • 关于post请求无法传递headers的token,而get可以

    关于预请求的发送: 之前一直报“签名验证不通过”,如下图,可以看到只有一个请求,并非预请求 说明这是一个简单请求,...

  • CPK数字签名知识点

    数字签名算法包含签名和验证两项操作,遵循私钥签名,公钥验证的签名验证方式,其中核心算一种法主要是消息摘要算法,因此...

  • podspec文件自动验证,手动验证

    自动验证: 但是自动验证不通过,确信代码无误可以手动验证。 手动验证: 本地clone,git上的私有仓库进入gi...

  • 区块链密码学

    1、群签名:以太坊使用BLS群签名 只有群中成员能够代表群体签名(群特性); 接收者可以用公钥验证群签名(验证简单...

  • SIG签名文件验证和哈希摘要算法

    .sig签名文件验证 Linux中.sig签名文件验证下载资源(涉及软件GnuPG: https://www.gn...

  • WKWebview加载自签名证书https网页

    验证自签名证书全过

  • 6-数字签名

    数字签名 数字签名算法用于验证数据完整性、认证数据来源及抗否认服务。数字签名算法包含签名和验证两项操作,用私钥进行...

  • 使用 Joi 表单验证

    安装 Joi 库: 基本使用: 如果验证不通过,错误信息在 result.error.details 中,如果验证...

  • Android反编译破解签名验证

    Android Studio无源码调试app 很多apk对签名做了验证,重新打包的apk没办法运行,不过签名验证都...

网友评论

      本文标题:签名验证不通过

      本文链接:https://www.haomeiwen.com/subject/xcpbhqtx.html