Encryption Apple Pay-如何将商户公钥与支付令牌中的公钥哈希进行比较?
我正在进行Apple Pay支付令牌解密。 根据步骤2的说明。我需要使用支付令牌头中的publicKeyHash字段来确定 商人证书被苹果公司使用 pulbicKeyHash是商户证书的X.509编码公钥字节的SHA–256哈希,Base64编码为字符串 我有一张商业证书。所以我假设,如果我将证书公钥的sha-256散列并对其进行Base64编码,我将得到与在支付令牌的publicKeyHash字段中接收到的值相同的值 但是我不知道应该散列证书的哪一部分。 苹果提供的初始商户证书采用.cer格式。 我已经将公钥提取到.pem格式。然后我尝试了公钥的hash->base64编码(介于------开始证书------和------结束证书------之间的字符串)和 将base64的哈希值解码为.pem,我认为应该是.der,并对其进行base64编码 而且两者都未能匹配从苹果支付收到的价值。而且它有不同的长度。我的base64编码哈希长度为88个字符,publicKeyHash字段长度为44个字符 当我尝试对publicKeyHash进行64位解码时,我得到了无法解码的字符,如“D”�đ���$�F���@C���$����可湿性粉剂��" 但根据苹果公司的文档,应该有sha-256哈希,它不能包含这样的符号Encryption Apple Pay-如何将商户公钥与支付令牌中的公钥哈希进行比较?,encryption,base64,sha256,applepay,Encryption,Base64,Sha256,Applepay,我正在进行Apple Pay支付令牌解密。 根据步骤2的说明。我需要使用支付令牌头中的publicKeyHash字段来确定 商人证书被苹果公司使用 pulbicKeyHash是商户证书的X.509编码公钥字节的SHA–256哈希,Base64编码为字符串 我有一张商业证书。所以我假设,如果我将证书公钥的sha-256散列并对其进行Base64编码,我将得到与在支付令牌的publicKeyHash字段中接收到的值相同的值 但是我不知道应该散列证书的哪一部分。 苹果提供的初始商户证书采用.cer格式
有人能告诉我,为了完成这项商户证书检查,我应该执行哪些具体步骤吗?在我的案例中,主要问题和解决方案是使用支付处理证书的公钥散列和非商户身份证书的公钥散列,我正在尝试ng与支付令牌中的PublicKeyHash进行比较。 在我的辩解中,我可以说,以下来自的文本非常模糊: publicKeyHash SHA–256哈希,Base64编码为 商户证书的X.509编码公钥字节 由于我们有两种证书,即商户证书和支付处理证书。对我来说,很明显,文档中的商户证书就是商户id证书 仅在重新阅读付款处理证书说明后 支付处理证书。用于安全地 转移支付数据。苹果支付服务器使用支付处理 证书的公钥用于加密支付数据 处理付款时解密数据的密钥 从文件中我意识到了我的错误
因此,我希望我的经验能帮助人们不要踩在同一个耙子上)在我的案例中,主要问题和解决方案是使用支付处理证书的公钥散列和非商户身份证书的公钥散列,我正试图将其与payme的公钥散列进行比较nt代币。 在我的辩解中,我可以说,以下来自的文本非常模糊: publicKeyHash SHA–256哈希,Base64编码为 商户证书的X.509编码公钥字节 由于我们有两种证书,即商户证书和支付处理证书。对我来说,很明显,文档中的商户证书就是商户id证书 仅在重新阅读付款处理证书说明后 支付处理证书。用于安全地 转移支付数据。苹果支付服务器使用支付处理 证书的公钥用于加密支付数据 处理付款时解密数据的密钥 从文件中我意识到了我的错误
因此,我希望我的经验能帮助某些人避免重蹈覆辙)这个问题和公认的答案在细节上仍然有点模糊,因此这里有一个在java中经过精确测试的方法来检查
token.paymentData.header.publicKeyHash
是否与Apple Pay支付处理证书匹配:
private static void checkPublicKeyHash(String publicKeyHash, X509Certificate paymentProcessingCertificate)
throws NoSuchAlgorithmException, CertificateException {
String certHash = Base64.getEncoder().encodeToString(
MessageDigest.getInstance("SHA-256").digest(
paymentProcessingCertificate.getPublicKey().getEncoded()));
if (!Objects.equals(publicKeyHash, certHash)) {
throw new DigestException(String.format(
"publicKeyHash %s doesn't match Payment Processing Certificate hash %s",
publicKeyHash, certHash));
}
}
这个问题和公认的答案在细节上仍然有点模糊,因此下面是java中经过精确测试的方法,用于检查
token.paymentData.header.publicKeyHash
是否与Apple Pay支付处理证书匹配:
private static void checkPublicKeyHash(String publicKeyHash, X509Certificate paymentProcessingCertificate)
throws NoSuchAlgorithmException, CertificateException {
String certHash = Base64.getEncoder().encodeToString(
MessageDigest.getInstance("SHA-256").digest(
paymentProcessingCertificate.getPublicKey().getEncoded()));
if (!Objects.equals(publicKeyHash, certHash)) {
throw new DigestException(String.format(
"publicKeyHash %s doesn't match Payment Processing Certificate hash %s",
publicKeyHash, certHash));
}
}
遗憾的是,我无法找到openssl命令直接从证书中提取哈希。因此,必须先创建公钥才能获取公钥哈希。提取公钥有两种方法 步骤1 A.来自您的ecc私钥(支付处理私钥) 或 B.从苹果支付门户下载的证书(上传支付处理csr后) 两者都将以以下格式为您提供公钥
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENGbyXUzeZTdeyyNuXyc0nMzXmnLl
xMwd/t/sCZr3RPhytPbZpR/V4/xHqN/MVzozzq30I0/eUefbThEBl236Og==
-----END PUBLIC KEY-----
步骤2您可以使用以下代码从上述公钥中提取base64哈希,记住删除页眉/页脚和换行符 我希望我能想出如何使用openssl工具从公钥中获取哈希值,但不管怎样,下面的c代码对我来说很有用。它非常简单,很容易移植到java/python/php或您喜欢的任何东西。或者在 请记住,您的系统应该能够在任何给定时间接受多个密钥,而不仅仅是根据您从设备(iphone/ipad等)接收到的公钥散列来验证您是否需要加载正确的私钥,考虑到当前证书即将过期(或您因任何原因撤销证书)的情况否则,您的系统可能在短时间内无法接受交易。根据我的一次遭遇,苹果花了一个多小时才启动新的支付处理键,然后按
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENGbyXUzeZTdeyyNuXyc0nMzXmnLl
xMwd/t/sCZr3RPhytPbZpR/V4/xHqN/MVzozzq30I0/eUefbThEBl236Og==
-----END PUBLIC KEY-----
String publicKeyBase64 = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENGbyXUzeZTdeyyNuXyc0nMzXmnLlxMwd/t/sCZr3RPhytPbZpR/V4/xHqN/MVzozzq30I0/eUefbThEBl236Og==";
byte[] publicKey = Convert.FromBase64String(publicKeyBase64);
SHA256 sha256 = SHA256Managed.Create();
byte[] hash = sha256.ComputeHash(publicKey);
String publicKeyHash = Convert.ToBase64String(hash);
Console.WriteLine("Result: {0}", publicKeyHash);