Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 OAuth2和SSL是否足以保护API_Security_Api_Ssl_Oauth_Oauth 2.0 - Fatal编程技术网

Security OAuth2和SSL是否足以保护API

Security OAuth2和SSL是否足以保护API,security,api,ssl,oauth,oauth-2.0,Security,Api,Ssl,Oauth,Oauth 2.0,我正试图找出保护API的最佳方法。我只允许SSL,我使用OAuth2进行身份验证,但这似乎还不够 我主要担心的是,任何人都可能检查合法客户端对API发出的请求,并窃取OAuth客户端id。在这一点上,他们将能够构造任何他们想要模拟合法客户端的请求 有没有办法防止这种情况?我见过有人使用HMAC散列参数,使用的密钥只有客户机和服务器知道,但我发现有两个问题 很难(不可能?)阻止恶意用户对客户端进行反编译并找出密钥 有些参数似乎很奇怪,无法对其进行HMAC哈希。例如,如果一个参数是一个文件的字节,您

我正试图找出保护API的最佳方法。我只允许SSL,我使用OAuth2进行身份验证,但这似乎还不够

我主要担心的是,任何人都可能检查合法客户端对API发出的请求,并窃取OAuth客户端id。在这一点上,他们将能够构造任何他们想要模拟合法客户端的请求

有没有办法防止这种情况?我见过有人使用HMAC散列参数,使用的密钥只有客户机和服务器知道,但我发现有两个问题

  • 很难(不可能?)阻止恶意用户对客户端进行反编译并找出密钥
  • 有些参数似乎很奇怪,无法对其进行HMAC哈希。例如,如果一个参数是一个文件的字节,您是否将整个内容包含在HMAC哈希中

  • 您是否通过SSL本身运行OAuth身份验证步骤?这可以防止各种类型的窥探,尽管这确实意味着您必须小心保持OAuth服务器的证书最新。(请注意,OAuth服务器可以有一个公共SSL标识;即使付出相当多的努力,也不可能伪造。需要保密的只是私钥。)


    也就是说,你需要更加小心你所保护的东西。为什么人们必须使用你的客户端代码?为什么一定要保密?更容易分发,并将smarts(包括登录身份验证)放在服务器上。如果有人想写他们自己的客户,就让他们写吧。如果有人想以愚蠢的方式公开挥动他们的帐户,请向他们收取他们因愚蠢而产生的成本…

    您可以在合法客户端和API之间部署相互验证的SSL。生成自签名SSL客户端证书并将其存储在客户端中。将服务器配置为需要客户端身份验证,并且只接受已部署到客户端的证书。如果试图连接的某人/某物没有该客户端证书,它将无法建立SSL会话,并且不会进行连接。假设您控制合法的客户端和服务器,您不需要CA颁发的证书;只需使用自签名证书,因为您可以同时控制客户端和服务器端证书信任

    现在,您确实需要指出,很难阻止某人对您的客户端进行反向工程并恢复您的凭据(在本例中,是属于客户端证书的私钥)。你是对的。您通常会将该密钥(和证书)存储在某种类型的密钥库中(如果您使用Android,则为
    密钥库
    ),并且该密钥库将被加密。该加密基于密码,因此您需要(1)将该密码存储在客户端的某个位置,或者(2)在用户启动客户端应用程序时要求用户输入密码。您需要做什么取决于您的用例。如果(2)是可接受的,那么您已经保护您的凭证不受反向工程的影响,因为它将被加密,并且密码不会存储在任何地方(但用户每次都需要键入密码)。如果您这样做(1),那么某人将能够对您的客户端进行反向工程,获取密码、密钥库、解密私钥和证书,并创建另一个能够连接到服务器的客户端


    你无法阻止这一切;您可以使代码的逆向工程变得更加困难(通过模糊处理等),但不能使其不可能。您需要确定使用这些方法试图降低的风险是什么,以及需要做多少工作来降低风险

    OAuth步骤是通过SSL进行的。我试图保护一个API,该API将由运行在用户计算机上的多个不同客户端调用。我从OAuth流获得的身份验证代码被传递到请求的授权头中的所有API调用。然后在服务器上验证代码。它是OAuth2,必须通过SSL。