Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 创建仅对手机有效的访问令牌(JWT)_Security_Authentication_Jwt_Asp.net Core Webapi - Fatal编程技术网

Security 创建仅对手机有效的访问令牌(JWT)

Security 创建仅对手机有效的访问令牌(JWT),security,authentication,jwt,asp.net-core-webapi,Security,Authentication,Jwt,Asp.net Core Webapi,我从事一个项目,该项目使用令牌(jwt)对移动应用程序中的用户进行身份验证。我想知道有一种方法,每一个令牌只对一部手机有效?例如,用户在应用程序中接收到的令牌在诸如邮递员或其他电话之类的软件中不起作用基本上,您需要的是设备的唯一指纹。我建议使用这个图书馆 生成设备唯一指纹后,可以在令牌生成阶段将该指纹发送到身份验证服务器,以便将其用作生成JWT签名的salt 最后,当设备将JWT发送回服务器进行身份验证时,它还必须发送自己的指纹。然后服务器将使用此指纹检查JWT签名 由于该库生成的指纹对于每个设

我从事一个项目,该项目使用令牌(jwt)对移动应用程序中的用户进行身份验证。我想知道有一种方法,每一个令牌只对一部手机有效?例如,用户在应用程序中接收到的令牌在诸如邮递员或其他电话之类的软件中不起作用

基本上,您需要的是设备的唯一指纹。我建议使用这个图书馆

生成设备唯一指纹后,可以在令牌生成阶段将该指纹发送到身份验证服务器,以便将其用作生成JWT签名的salt

最后,当设备将JWT发送回服务器进行身份验证时,它还必须发送自己的指纹。然后服务器将使用此指纹检查JWT签名

由于该库生成的指纹对于每个设备都是唯一的,因此它还确保JWT仅应用于该设备

编辑: @我不想走那么远,因为我认为问题是阻止普通用户在多台设备上使用令牌。但是既然你问了,我建议创建一个散列生成器,在安装应用程序时为每个设备提供唯一的秘密。必须根据以下内容生成和验证哈希字符串:

  • 上面提到的独特秘密。注意,这个秘密也被用作生成JWT签名的salt
  • 从发送请求时开始计算的时间戳(定义这些时间戳的规则是在客户端的哈希生成器和服务器上的哈希检查器之间预定义的,以便两者可以并行地产生相同的时间戳,而无需彼此通信)
  • 因此,为了确保web服务的安全,每个请求都必须通过该哈希生成器进行路由,在该生成器中将哈希字符串附加到请求头,以便web服务器能够识别。然后,web服务器计算时间戳,扫描其秘密数据库以找到与从客户端发送的哈希匹配的时间戳。然后用这个秘密来验证JWT

    这种在客户端发送请求和在服务器上接收请求时产生相同时间戳的算法非常容易建立。例如:给定一个请求的超时时间为3秒,它可能是下一个时间戳(T),这样:
    T%3==0
    在客户端和web服务器上,匹配的时间戳是下一个或上一个可被3整除的时间戳


    由于以这种方式生成的时间戳,每个令牌只有很短的生存时间(在上述情况下为3s),因此不能在其他地方使用。我能想到的唯一方法就是对哈希生成器进行反向工程,并在其中找到秘密。

    任何请求都可以模拟。 这几乎是不可能的 您可以使用刷新令牌 减少你的代币时间 如果有人访问了问题所在的

    ,它们将很快过期 我想知道有一种方法,每一个令牌只对一部手机有效?例如,用户在应用程序中收到的令牌在邮递员或其他电话等软件中不起作用

    嗯,你发现自己是一个很难但并非不可能解决的问题。是的,在移动API的上下文中,解决它是可能的,这个概念被称为移动应用程序认证

    所以让我们分阶段深入研究你的问题

    我从事一个项目,该项目使用令牌(jwt)对移动应用程序中的用户进行身份验证

    要在API服务器中对请求进行身份验证,您需要知道两件事,谁在执行请求,以及什么在执行请求,否则您将永远无法断言用户是真正的人,而不是其他人

    让我澄清一下关于谁访问您的API服务器与什么访问您的API服务器的常见误解

    访问API服务器的用户和用户之间的差异 为了更好地理解访问API服务器的人和什么人之间的区别,让我们使用以下图片:

    预期的通信通道代表移动应用程序,正如你所预期的,由合法用户使用,没有恶意的意图,使用未篡改的移动应用程序版本,直接与API服务器通信而不受中间人攻击。

    实际频道可能代表几种不同的场景,比如一个恶意用户,可能使用一个重新打包的移动应用程序版本,一个使用移动应用程序的真正版本的黑客,而中间人攻击它。了解移动应用程序与API服务器之间的通信方式,以便能够自动攻击您的API。许多其他场景都是可能的,但我们在这里不一一列举

    我希望到现在为止,你可能已经知道为什么什么不一样了,但如果不一样,过一会儿就会清楚了

    是移动应用程序的用户,我们可以通过多种方式进行身份验证、授权和识别,比如使用OpenID Connect或OAUTH2流

    通常,OAuth代表资源所有者向客户端提供对服务器资源的“安全委托访问”。它为资源所有者指定一个过程,以授权第三方访问其服务器资源,而不共享其凭据。OAuth专门设计用于超文本传输协议(HTTP),本质上允许授权服务器在资源所有者的批准下向第三方客户机颁发访问令牌。然后,第三方使用访问令牌访问由资源服务器承载的受保护资源

    OpenID Connect 1.0是OAuth 2.0协议之上的一个简单标识层。它允许客户端验证最终用户的身份