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