java.lang.IllegalArgumentException:签名值4处意外的char 0x1d:

时间:2018-08-21 14:44:43

标签: java android retrofit2

我正在使用改造来呼叫我的服务。我的一项服务具有由SHA256-RSA签名的标头参数,但是当我调用请求时,出现了这样的错误:

java.lang.IllegalArgumentException: Unexpected char 0x1d at 4 in signature value: "|._趿s<�ˠ"

我的请求方法是:

Call<ResponseBody> getToken(@Header("Signature") String Signature,@Header("signature") String signature,@Header("headers") String headers, @Field("username") String username, @Field("password") String password, @Field("grant_type") String grantType);

我的签名方法是:

 String pkcs8Pem = pkcs8Lines.toString();
        pkcs8Pem = pkcs8Pem.replace("-----BEGIN PRIVATE KEY-----", "");
        pkcs8Pem = pkcs8Pem.replace("-----END PRIVATE KEY-----", "");
        pkcs8Pem = pkcs8Pem.replaceAll("\\s+", "");

        // Base64 decode the result

        byte[] pkcs8EncodedBytes = Base64.decode(pkcs8Pem, Base64.DEFAULT);

        // extract the private key

        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PrivateKey privKey = kf.generatePrivate(keySpec);

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privKey);
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privKey);
        signature.update(message.getBytes());
        return signature.sign();

您能帮忙吗?

1 个答案:

答案 0 :(得分:0)

有多个字符可能会导致此错误,例如,此github问题中所述的不可见换行符:

https://github.com/square/retrofit/issues/1153

okhttp Client禁止使用此方法,改造使用该方法进行http调用。 我建议您记录小写签名者的结果,并直接检查哪个字符引起了麻烦。

祝你好运!