Google关于实现认证API的说明如下:
Obtain a nonce. Request a SafetyNet attestation. Transfer the response to your server. Use the response on your server, along with your other anti-abuse signals, to control your app's behavior.
我知道应该从服务器获取nonce。如何阻止攻击者运行两个版本的应用程序——一个在合法设备上,另一个在不安全设备上,并执行以下操作:
- 不安全设备上的应用程序从我的服务器获取nonce
- 安全设备上的应用程序使用此随机数调用Google的证明API
- 安全设备上的应用程序从谷歌获得JWS签名响应
- 攻击者将JWS响应传输到不安全设备上的应用程序
- 不安全设备上的应用程序向我的服务器发送JWS响应
我的应用程序服务器会验证JWS(包括nonce(,并认为不安全设备上的应用程序实际上是安全的。
这并不像听起来那么简单。例如,如果您使用证书钉扎,中间人攻击将很难甚至几乎不可能。
因此,现在可以选择对应用程序进行反向工程并捕获JWS,在这里,您可以添加模糊处理,使反向工程更加困难。
如果他拿到了JWS,你可以限制JWS存储在后端的可用时间,并使其更难使用(可能只允许JWS存储5分钟或更短时间(;使"无效";
此外,正如谷歌所提到的,如果你根据用户将与当前请求一起发送到服务器的一些数据构建随机数,攻击者也需要在请求中包含这些数据,因为你可以简单地反向计算随机数(如果你已经存储了最终随机数+你计算的随机数据(,如果这不匹配,你可以简单拒绝请求。
此外,如果设备是安全的,攻击者就不应该仅仅从中提取随机数
请对此持谨慎态度,因为我不是安全专家。