java - 在 Web 应用程序中使用 QR 进行移动身份验证

标签 java android security authentication oauth-2.0

我对下一个技术解决方案的正确模式应该是什么表示怀疑。 我需要通过读取 QR 码来验证移动应用程序中的用户,该用户之前已在 Web 应用程序中进行过身份验证。

用例包括用户使用位于 Intranet 中的 Web 应用程序,但需要能够从将连接到 Internet 的移动设备上传图像。 移动应用程序将使用通过 API 网关公开在互联网上的公共(public) API。 API 网关将连接到后端以上传图像。 作为一项要求,当用户需要使用移动设备拍摄和上传图像时,他们不应再次进行身份验证,因为他们在 Web 应用程序中有一个打开的 session ,只需使用二维码对设备进行身份验证即可。从逻辑上讲,QR 不会使用用户的凭据。

我的想法是通过以下流程使用 Oauth 2.0 来验证移动设备:

  1. Web 应用程序请求 API 网关生成授权 token ,并使用 UUID 进行响应。
  2. Web 应用程序将使用从 API 网关收到的二维码来显示授权 token 。
  3. 移动设备将读取二维码,并使用授权 token 向 API 网关请求访问 token 。
  4. API 网关验证授权 token 并生成返回到移动设备的访问 token 。
  5. 移动设备使用访问 token 调用公共(public) API(API 网关)。

我的问题是是否是正确的方案,还是有其他标准方案。

谢谢!!

最佳答案

您的方案可以工作,但考虑到您可以将新生成的授权 token 从已经授权的设备直接传输到另一台设备(通过摄像头读取的二维码)这一事实,它没有发挥其最大的安全潜力;这个事实会使第 3 步和第 4 步成为一个不必要的漏洞(这也是一种冗余,已经有一个 token !,为什么还要另一个?);

以下替代方案以及良好的密码学可以使后来的授权设备连接几乎不可能被入侵。这个想法是通过在步骤 5 中发送数据之前添加对称加密层并使用通过另一种介质交换的 key (已经授权的设备和服务器)加密数据永远不会暴露;

第三步替换:读取授权 token ;

step 4 replacement:用服务器检查授权 token (而不是 token 本身)的安全哈希派生,看它是否有效;

token0=read_auth_token_from_camera()
public_token=hash_function(token0) //the useless exposed token
if(check_token_with_server_for_authenticity(public_token)==true)
    continue_to_step_5() //it's authorized
else
    handle_the_scenario()

第 5 步替换:使用授权 token 的另一个哈希派生加密您的请求和授权 token ,然后调用服务器 API;

token2=another_hash_function(token0)
request="i am top secret data"
encryption_key=token0
encrypted_request=encryption_function( token2 + request , encryption_key)
send_to_server( public_token+encrypted_request)
//notice that token2 is unknown to the intruder because its encrypted,but it is known to the server; hence the authenticity of each request can be checked by the server;

它如何更安全:在这种替代方式中,实际的授权 token 永远不会在服务器和新客户端之间真正交换;因此,如果入侵者可以假设地破坏 SSl/TLS 层并捕获公共(public) token ,则入侵者将无法代表您发送任何请求或修改请求中的数据;

关于java - 在 Web 应用程序中使用 QR 进行移动身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53959819/

相关文章:

java - 如何从 Servlet 输出文本到控制台

android - 设备上的文件系统处于错误状态。 WorkManager 无法访问应用程序的内部数据存储

android - 以编程方式隐藏 Android 按钮后使布局居中

linux - 为什么 "ulimit -s unlimited"可以在溢出时反ASLR?

xml - 如何将 XML RSA key 转换为 PEM 文件?

java - 向界面添加信息

java - 如果我在 t2 分配给 t1 时设置 t1=null 会发生什么?

java - HashMap 中克隆方法的输出

android - ChatSecure应用程序崩溃

java - 是否可以禁止关闭 Android 应用程序?