android java.lang.IllegalArgumentException:签名值中4处的意外字符0x1d:

jgwigjjp  于 2023-06-04  发布在  Android
关注(0)|答案(2)|浏览(194)

我在用改装版来打电话。我的一个服务有一个由SHA 256-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();

能帮我一下吗?

vecaoik1

vecaoik11#

有几个字符,可能会导致此错误,例如不可见的换行符,如在此github问题中所述:
https://github.com/square/retrofit/issues/1153
okhttp Client禁止这样做,它被reflect用来进行http调用。我建议您记录小写签名者esult,并直接检查哪个字符导致了问题。
祝你好运!

dwthyt8l

dwthyt8l2#

这只能通过从版本2.10.0开始的改进来解决,该版本目前仅作为SNAPSHOT版本提供(Pull-Request:https://github.com/square/retrofit/pull/3661)。
在2.10.0版本中,你可以简单地允许不安全的非ascii值作为你的头:

@Header("Signature", allowUnsafeNonAsciiValues = true)

为了使用SNAPSHPT版本,您需要在root build中添加sonatype作为附加源。gradle:

repositories {
    ...
    
    maven {
        url "https://s01.oss.sonatype.org/content/repositories/snapshots/"
    }
}

此外,您需要在yout模块级build.gradle中使用快照版本:

dependencies {    
   ...

   // as of today this is the latest SNAPSHOT version..
   implementation "com.squareup.retrofit2:retrofit:2.10.0-20230517.223446-56"
}

相关问题