Google Cloud Endpoints:verifyToken:签名长度不正确

2024-03-30

今天早上,从我的 Android 应用程序向我的 Google Cloud Endpoint 发出的每个 API 请求都开始出现以下异常:

com.google.api.server.spi.auth.GoogleIdTokenUtils verifyToken: verifyToken:签名长度不正确:得到 256 但符合预期 128

该调用在我的 javascript Web 客户端中仍然可以完美运行。我没有更改服务器端代码或客户端代码。

最近该服务是否发生了任何可能导致这种情况发生的变化?

更新:第一次出现此情况似乎是在 UTC 时间 11:17:07

更新:不起作用的事情包括为 android 生成新的客户端 ID 并更新到 App Engine SDK 1.9.22


原因

  • RSA 具有可变长度签名,具体取决于密钥大小。
  • Google 更新了用于签名的密钥对,现在其中一个密钥对生成与另一个密钥对不同长度的签名
  • java.security.Signature.verify(byte[] signature)如果传递了错误长度的签名,则抛出异常(而不是返回 false,通常在签名与密钥不匹配时返回 false)

对我来说,解决方案是包装验证调用(try...catch),并返回 false。 您还可以自己对公钥进行早期检查,检查签名的长度是否与公钥模数的长度匹配。

如果您使用库来检查签名,请确保使用最新版本。

查看示例代码http://android-developers.blogspot.nl/2013/01/verifying-back-end-calls-from-android.html http://android-developers.blogspot.nl/2013/01/verifying-back-end-calls-from-android.html,你必须改变这个:

GoogleIdToken token = GoogleIdToken.parse(mJFactory, tokenString);

to

JsonWebSignature jws = JsonWebSignature.parser(mJFactory).setPayloadClass(Payload.class).parse(tokenString);
GoogleIdToken token = new GoogleIdToken(jws.getHeader(), (Payload) jws.getPayload(), jws.getSignatureBytes(), jws.getSignedContentBytes()) {
   public boolean verify(GoogleIdTokenVerifier verifier)
  throws GeneralSecurityException, IOException {
       try {
           return verifier.verify(this);
       } catch (java.security.SignatureException e) {
           return false;
       }
   }
};

不幸的是,我没有确切的设置来测试这一点。

对于那些使用 Google Cloud Endpoint 的人来说,就像问题所述,我认为除了等待 Google 修复它之外,您无能为力。幸运的是现在已经修复了。 (从技术上讲,你可能会认为改变密钥,就像现在所做的那样,是一种解决方法,谷歌提供的库需要修复。但它有效,所以这是一个好的开始)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Cloud Endpoints:verifyToken:签名长度不正确 的相关文章

随机推荐