如何使用Java JDK 1.7在我的第三方服务器上对GKLocalPlayer进行身份验证?

米兰布拉姆博特

使用此处概述的Apple的Game Center身份验证验证步骤,已使用Java实现了以下验证逻辑。但是,这总是失败。

import java.net.URL;

import java.nio.ByteBuffer;

import java.nio.ByteOrder;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.MessageDigest;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.SecureRandom;

import java.security.Signature;

import java.security.cert.Certificate;

import java.security.cert.CertificateFactory;

import java.security.spec.AlgorithmParameterSpec;

import java.util.Arrays;

import javax.crypto.Cipher;

import javax.xml.bind.DatatypeConverter;

public class Verifier {

    public static void main(String[] args) {

        verify1();   

    }



    public static void verify1() {

        try {

            byte[] playerID = "G:90082947".getBytes("UTF-8");

            byte[] bundleID = "com.appledts.GameCenterSamples".getBytes("UTF-8");



            long ts = 1392078336714L;

            final ByteBuffer tsByteBuffer = ByteBuffer.allocate(8);

            tsByteBuffer.order(ByteOrder.BIG_ENDIAN);

            tsByteBuffer.putLong(ts);           

            byte[] timestamp = tsByteBuffer.array();



            byte[] salt = DatatypeConverter.parseBase64Binary("xmvbZQ==");



            byte[] sigToCheck = DatatypeConverter.parseBase64Binary("AmyNbm+7wJOjXv6GXI/vAEcl6gSX1AKxPr3GeExSYCiaxVaAeIvC23TWtp1/Vd/szfq1r1OzwrvkHeSSiskWMsMXaGQWUmiGtCnf9fqBU75T5PwNLCj4H9Nd5QENCMV/CFgVyGEi4X6Wlp18kqJPk/ooS6jLJwcWIe6DyrR1bQHl6YzKTfB4ACl2JEccBDz8dArKTrh4vFcQF4a+DtERm283Y2ue1DwG8lqWrYhsRO5v7vrW3lVpn5t25QXc+Y35zJ/il+lZJxKAgASwrKaq3G8RStdkeXCER23fSYhTmbLFqkFRWnmzu38hmLt5/iivUbm8NgELXP0SyQoYLMvfmA==");



            ByteBuffer dataBuffer = ByteBuffer.allocate(playerID.length+bundleID.length+8+salt.length)

                .put(playerID)

                .put(bundleID)

                .put(timestamp)

                .put(salt);





            Certificate cert = CertificateFactory.getInstance("X.509")

                    .generateCertificate(new URL("https://sandbox.gc.apple.com/public-key/gc-sb.cer").openConnection().getInputStream());





            Signature sig = Signature.getInstance("SHA1withRSA");

            sig.initVerify(cert);



            sig.update(dataBuffer);



            final boolean verify = sig.verify(sigToCheck);

            System.out.println("signature verifies: " + verify);                            



        } catch (Exception e) {            

            e.printStackTrace();

        }

    }        

}

从iOS 7客户端向服务器传输数据时,不会丢失任何比特。通过将二进制位写入来自xCode和Java的文件中,生成它们的十六进制,并查看是否存在任何差异(请注意,差异仅显示文件名diff)来验证这一点:

$ xxd -i salt_Java.txt salt_java.xxd

$ xxd -i salt_xcode.txt salt_xcode.xxd

$ xxd -i sigToCheck_Java.txt sigToCheck_java.xxd

$ xxd -i sigToCheck_xcode.txt sigToCheck_xcode.xxd

$ diff salt_java.xxd salt_xcode.xxd 

1c1

< unsigned char salt_Java_txt[] = {

---

> unsigned char salt_xcode_txt[] = {

4c4

< unsigned int salt_Java_txt_len = 4;

---

> unsigned int salt_xcode_txt_len = 4;

$ diff sigToCheck_java.xxd sigToCheck_xcode.xxd 

1c1

< unsigned char sigToCheck_Java_txt[] = {

---

> unsigned char sigToCheck_xcode_txt[] = {

25c25

< unsigned int sigToCheck_Java_txt_len = 256;

---

> unsigned int sigToCheck_xcode_txt_len = 256;

$ 

我认为这失败是因为Signature类使用了底层Java库,因为此处列出的Objective-C解决方案似乎可以成功验证相同的凭据。

我的下一个尝试是使用Java的[Cipher]和[MessageDigest]库而不是[Signature]库,但这也失败了。我怀疑在使用提供的签名位检查签名摘要位之前,还缺少其他步骤。

final MessageDigest md = MessageDigest.getInstance("SHA1");

byte[] digest = md.digest(dataBuffer.array());

// RSA decrypt

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

cipher.init(Cipher.DECRYPT_MODE, cert);

byte[] decrypted = cipher.doFinal(sigToCheck);    



System.out.println("signature verifies: " + Arrays.equals(digest, decrypted));

在上面发布的解决方案中,是否可以使用其他方法来验证数字签名或存在任何空白?

克里斯·巴恩斯

问题似乎出在传递给Signature.update()的ByteBuffer上。如果通过更改传递基础数组

sig.update(dataBuffer);

sig.update(dataBuffer.array());

验证似乎成功。根据Signature.update(ByteBuffer)的文档,我怀疑这是因为它试图从您在缓冲区中写入的最后一个位置读取数据,而未找到任何数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在“第三方服务器”上对GKLocalPlayer进行身份验证?

来自分类Dev

我应该使用什么HTTP代码进行第三方身份验证失败?

来自分类Dev

在 Firebase 实时数据库中,未经身份验证的第三方服务器(使用 Admin SDK)如何从我的数据库中读取未受保护的数据?

来自分类Dev

如何通过iframe调用对第三方网站进行身份验证

来自分类Dev

如何通过iframe调用对第三方网站进行身份验证

来自分类Dev

商业VPN上的服务器,希望避免使用第三方帮助进行连接

来自分类Dev

如何将ASP.net Identity与第三方REST服务一起使用以进行身份验证?

来自分类Dev

我如何从NAnt的NuGet服务器获得第三方依赖关系?

来自分类Dev

使用PHP脚本而不使用第三方软件的SMTP身份验证

来自分类Dev

如何使用django的基本访问身份验证将客户端登录到第三方网站

来自分类Dev

是否可以从第三方Java服务器注册android设备?

来自分类Dev

如何向第三方服务器发出承诺电话?

来自分类Dev

使用密码凭证流和某些第三方授权服务器

来自分类Dev

Qt5-QML:在第三方设备上使用的自动身份验证用户名和密码

来自分类Dev

如何安全地(通过适当的身份验证)与客户端上的第三方API通信?

来自分类Dev

我可以/如何在第三方对象上实现IEnumerable进行排序...仅使用LINQ吗?

来自分类Dev

如何在Ubuntu 16.04.2 TLS服务器(mpt3sas v15)上正确安装/更新.deb第三方驱动程序?

来自分类Dev

使用 .NET 调用第三方 API 服务器端并传递变量以在 Javascript 中使用

来自分类Dev

使用OAuth将REST调用从节点服务器发送到第三方应用程序

来自分类Dev

安装第三方库以在Google App Engine开发服务器内外均可使用

来自分类Dev

使用jQuery从Vagrant VM上托管的第三方Node.js服务器获取数据-JSONP

来自分类Dev

传输任何大小的文件,而无需使用php上传到第三方服务器

来自分类Dev

GCM多少个第三方服务器可以使用一个服务器密钥?

来自分类Dev

GCM可以使用一个服务器密钥有多少个第三方服务器?

来自分类Dev

如何通过浏览器DevTools在第三方站点触发输入表单验证?

来自分类Dev

如何使用多个JAVA JDK启动Elasticsearch服务

来自分类Dev

与使用 Letsencrypt SSL(在 JDK7 上)保护的网站交谈时“未通过身份验证”

来自分类Dev

使用领事监控第三方服务

来自分类Dev

使用GIT进行协作-第三方库

Related 相关文章

  1. 1

    如何在“第三方服务器”上对GKLocalPlayer进行身份验证?

  2. 2

    我应该使用什么HTTP代码进行第三方身份验证失败?

  3. 3

    在 Firebase 实时数据库中,未经身份验证的第三方服务器(使用 Admin SDK)如何从我的数据库中读取未受保护的数据?

  4. 4

    如何通过iframe调用对第三方网站进行身份验证

  5. 5

    如何通过iframe调用对第三方网站进行身份验证

  6. 6

    商业VPN上的服务器,希望避免使用第三方帮助进行连接

  7. 7

    如何将ASP.net Identity与第三方REST服务一起使用以进行身份验证?

  8. 8

    我如何从NAnt的NuGet服务器获得第三方依赖关系?

  9. 9

    使用PHP脚本而不使用第三方软件的SMTP身份验证

  10. 10

    如何使用django的基本访问身份验证将客户端登录到第三方网站

  11. 11

    是否可以从第三方Java服务器注册android设备?

  12. 12

    如何向第三方服务器发出承诺电话?

  13. 13

    使用密码凭证流和某些第三方授权服务器

  14. 14

    Qt5-QML:在第三方设备上使用的自动身份验证用户名和密码

  15. 15

    如何安全地(通过适当的身份验证)与客户端上的第三方API通信?

  16. 16

    我可以/如何在第三方对象上实现IEnumerable进行排序...仅使用LINQ吗?

  17. 17

    如何在Ubuntu 16.04.2 TLS服务器(mpt3sas v15)上正确安装/更新.deb第三方驱动程序?

  18. 18

    使用 .NET 调用第三方 API 服务器端并传递变量以在 Javascript 中使用

  19. 19

    使用OAuth将REST调用从节点服务器发送到第三方应用程序

  20. 20

    安装第三方库以在Google App Engine开发服务器内外均可使用

  21. 21

    使用jQuery从Vagrant VM上托管的第三方Node.js服务器获取数据-JSONP

  22. 22

    传输任何大小的文件,而无需使用php上传到第三方服务器

  23. 23

    GCM多少个第三方服务器可以使用一个服务器密钥?

  24. 24

    GCM可以使用一个服务器密钥有多少个第三方服务器?

  25. 25

    如何通过浏览器DevTools在第三方站点触发输入表单验证?

  26. 26

    如何使用多个JAVA JDK启动Elasticsearch服务

  27. 27

    与使用 Letsencrypt SSL(在 JDK7 上)保护的网站交谈时“未通过身份验证”

  28. 28

    使用领事监控第三方服务

  29. 29

    使用GIT进行协作-第三方库

热门标签

归档