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
如何确保后端移动REST API只与我的应用程序通信?_Rest_Security_Mobile_Backend - Fatal编程技术网

如何确保后端移动REST API只与我的应用程序通信?

如何确保后端移动REST API只与我的应用程序通信?,rest,security,mobile,backend,Rest,Security,Mobile,Backend,目前,我有以下安全措施 登录后每个请求使用PassportJS的JWT令牌 目前仅对我的登录和注册端点进行速率限制 向用户发送电子邮件,告知未知用户已从其他设备登录 我还可以做些什么来保护后端?OWASP在这里提供了一个REST安全备忘单。 实际上,我们可以提到很多安全措施,但与您的列表类似的一个选项是, 如果您希望允许用户使用多设备访问服务,则可以添加到项目中的另一个安全功能是为每个用户管理活动设备。用户可以查看任何活动设备的日志并删除其中的任何设备。您当前的安全措施 目前,我有以下安全措施

目前,我有以下安全措施

  • 登录后每个请求使用PassportJS的JWT令牌
  • 目前仅对我的登录和注册端点进行速率限制
  • 向用户发送电子邮件,告知未知用户已从其他设备登录

  • 我还可以做些什么来保护后端?

    OWASP在这里提供了一个REST安全备忘单。
    实际上,我们可以提到很多安全措施,但与您的列表类似的一个选项是, 如果您希望允许用户使用多设备访问服务,则可以添加到项目中的另一个安全功能是为每个用户管理活动设备。用户可以查看任何活动设备的日志并删除其中的任何设备。

    您当前的安全措施 目前,我有以下安全措施

  • 登录后每个请求使用PassportJS的JWT令牌
  • 请记住,JWT令牌仅标识请求中的,而不是执行请求的内容

  • 目前仅对我的登录和注册端点进行速率限制
  • 祝贺您有了此度量,但您应该将其扩展到所有端点,并在每个端点的基础上调整速率限制。试着找出答案 正常使用情况下每秒/分钟的正常速率,并将速率限制设置为略高于该速率限制,并设置适当的监视,以查看何时由于超过速率限制而导致请求被阻止的峰值

  • 向用户发送电子邮件,告知未知用户已从其他设备登录
  • 这是一个人们不经常谈论甚至不实施的措施,但它是确保用户安全的一个非常重要的措施。您可以通过向用户电子邮件发送Approval链接,只允许从其他设备进行新登录来增强它

    访问API服务器的用户和用户之间的差异 在我深入探讨您的问题之前,
    我还可以做些什么来保护后端?
    我想首先澄清一个误解,这通常是我在任何资历的开发人员中发现的,即谁访问API服务器与什么访问API服务器之间的区别

    我写了一系列关于API和移动安全的文章,在这篇文章中,您可以详细了解访问您的API服务器的人与人与人之间的区别,但我将在此摘录其中的主要内容:

    什么是向API服务器发出请求的东西。它真的是你的移动应用程序的真实实例,还是一个机器人、一个自动脚本或一个攻击者用Postman之类的工具在你的API服务器上手动戳来戳去

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

    因此,将视为您的API服务器能够验证和授权访问数据的用户,并将什么视为代表您使用PassportJS JWT令牌验证的用户发出请求的软件

    其他安全措施 我还可以做些什么来保护后端

    正如您现在可能知道的,您缺少允许后端验证请求执行情况的措施,因为您当前的措施以请求中的谁为中心,由PassportJS JWT令牌表示

    为了让后端更自信地接收来自移动应用程序的请求,您需要从移动应用程序和后端这两方面着手

    HMAC-对请求进行数字签名 因此,您可以首先对移动应用程序向后端发送的请求进行数字签名,您可以在移动应用程序中看到一种简单的签名方法:

    private-fun-calculateAppirequesthmac(url:url,authHeaderValue:String):String{
    val secret=JniEnv().getHmacSecret()
    var-keySpec:SecretKeySpec
    //根据演示阶段配置请求HMAC
    何时(当前演示阶段){
    DemoStage.API\u密钥\u保护,DemoStage.approv\u应用程序\u身份验证\u保护->{
    抛出IllegalStateException(“CalculateAppirequestHmac()未在此演示阶段使用”)
    }
    DemoStage.HMAC_静态_机密_保护->{
    //只需使用静态机密初始化此演示阶段的密钥规范
    keySpec=SecretKeySpec(Base64.decode(secret,Base64.DEFAULT),“HmacSHA256”)
    Log.i(标签“计算静态HMAC”)
    }
    DemoStage.HMAC_动态_机密_保护->{
    Log.i(标记“计算动态HMAC”)
    //模糊静态密钥以生成动态密钥来初始化密钥
    //此演示阶段的规范
    val obfuscatedSecretData=Base64.decode(secret,Base64.DEFAULT)
    val shipFastAPIKeyData=loadShipFastAPIKey().toByteArray(Charsets.UTF_8)
    for(0中的i直到minOf(模糊的secretdata.size、shipFastApikeData.size)){
    obfuscatedSecretData[i]=(obfuscatedSecretData[i].toInt()异或shipFastAPIKeyData[i].toInt()).toByte()
    }
    val obfuscatedSecret=Base64.encode(obfuscatedSecretData,Base64.DEFAULT)
    keySpec=SecretKeySpec(Base64.decode(obfuscatedSecret,Base64.DEFAULT),“HmacSHA256”)
    }
    }
    Log.i(标记,“协议:${url.protocol}”)
    Log.i(标记“host:${url.host}”)
    Log.i(标记,“路径:${url.path}”)
    Log.i(标记,“身份验证:$authHeaderValue”)
    //使用HMAC SHA-256算法计算请求HMAC
    val hmac=Mac.getInstance(“HmacSHA256”)
    hmac.in