2017-07-24 139 views
1

我想了解jwt签名验证如何工作。Android SafetyNet智威汤逊签名验证

这是我如何做它的时刻:与谷歌的

1) My app calls the attest api 
2) My app sends the jwt to my server 
3) My server verify the signature (third field of the jwt) using the certificate provided in the header of the jwt. 

据我所知,签名通过散列头和智威汤逊的有效载荷,然后在签名创建(将其加密)私钥。

我在第3步中做的是,我将头+有效负载和 证书的公钥解密,并验证它与签名匹配。 (当我说'我'的意思是一个库做它)

我的问题是,如果有用户设备上的恶意软件,并发送到我的服务器JWT动态修改会发生什么?恶意软件会在头中添加他自己的证书(由受信任的CA颁发),根据需要修改有效负载并创建签名。

我服务器端......以及我将采取在证书中提供的公钥有效签名与它匹配。

这是正确的吗?或者我在某个地方感到困惑?因为在这种情况下,它会使这一切都变得没有用处。我如何100%确保JWT来自谷歌?

回答

0

您确实正确掌握了这个概念。然而,你忽视的一点是,你使用的lib可能验证从中提取公钥的证书是有效的和'可信'证书(AKA来自可信CA)

感谢这(和就像doc指出的那样),你需要验证自己的证书是否已经由“attest.android.com”发布。没有人能够伪造证书,使其来自此CA,因为。

这是我至少理解的,如果我错了,请纠正我。

+0

我接受了您的申请,因为您先发布了它 – Johny19

1

关键的一点是验证签名证书是由受信任的证书颁发机构

任何信任的CA颁发给attest.android.com会发出假证书attest.android.com。看看他们从事不良行为会发生什么https://security.googleblog.com/2016/10/distrusting-wosign-and-startcom.html?m=1

见谷歌的doc

验证兼容性检查响应

你应该采取措施,以确保兼容性检查响应实际上从来到SafetyNet服务并包含与您的请求数据相匹配的数据。

小心:您应该使用安全连接将整个JWS响应发送到您自己的服务器进行验证。我们不建议您直接在您的应用中执行验证,因为在这种情况下,不能保证验证逻辑本身未被修改。

按照以下步骤来验证JWS消息的来源:

  1. 从JWS消息中提取SSL证书链。

  2. 验证SSL证书链并使用SSL主机名匹配来验证叶证书是否已颁发给主机名attest.android.com。

  3. 使用证书来验证JWS消息的签名。

  4. 检查JWS消息的数据以确保它与原始请求中的数据相匹配。特别要确保nonce,时间戳,包名称和SHA-256散列匹配。

第二点需要验证证书链。假设它使用包含证书颁发机构的根证书的信任管理器

我检查了Google的示例代码OfflineVerify以确保TrustManager的存在,因为它没有明确说出,并且在过程中有效使用JWS验证。它使用默认系统TrustManager,但您可以使用自定义的一个

请注意,使用JWS(Json Web签名)而不是JWT。 JWT通常是与JWS签署的身份验证令牌

+0

阻止我创建假证书并使其'由attest.android.com发布'。验证签名的库会否因为该证书中的公钥与TrustedManager中的公钥不匹配而失败? – Johny19

+0

准确地说,攻击者发出的假证书不会与存储在您信任存储区中的任何可信根证书签署,因此签名验证过程将失败。我检查了它到谷歌代码,因为它不清楚它使用的是什么信任库 – pedrofb