PHP REST api 的安全方式?

Secure way for PHP REST api?

我正在开发基于 PHPREST api。我有 android 应用程序,它将一些关键参数发送到服务器,服务器将响应数据。在这种情况下,电子邮件是获取所有相关数据的关键要素。如果我想让它安全,我可以将密码保存在 sharedPreferences 中并在每次请求时发送。这可能会使通信安全,但我知道 sharedPreferences 不安全,不建议将机密信息放入其中。另外,我不能在 sharedPreferences 中存储密码哈希,因为我在 php api 中使用 password_hash() 函数,它需要密码作为纯文本。所以,我只能以纯文本密码的形式发送请求。我应该怎么做才能使其安全?

OAuth2 with client_credentials GrantType 在我看来是最好的选择。 对于令牌,我会使用 JWT(在大多数 PHP 实现中是默认设置),它使您能够无状态地验证它并使您的身份验证环境更具可扩展性。

您将使用一组固定的客户端凭据(client_id 和可选的 client_secret)授权您的应用程序,以针对身份验证服务器使用其用户名和密码授权用户。然后将收到的令牌存储在 sharedPreferences 中以供进一步授权。

完成此类事情的正常方式通常是使用某种形式的令牌身份验证。

但是,您可能想了解有关安全性的更多信息,除非您正在做的只是您打算使用的玩具应用程序。话虽如此,PHP 在处理会话方面非常出色,因此您可以考虑在您的应用程序中使用 cookie jar 并利用会话。 REST 纯粹主义者可能会因为这个建议而绞死我,但你知道吗?如果您仅将 API 用于您的应用程序,它就可以完美运行。

另一个快速简便的解决方案是从您的应用程序进行正常的电子邮件和密码登录。成功后,return 一个随机生成的令牌给用户,并存储在您数据库的 table 中。此令牌是您可以存储在 sharedpref 中的内容,它将随每个请求一起发送。为了使事情更有趣,您可以允许令牌在 10 分钟后过期(如果未使用)。在您的应用中,这意味着用户需要再次登录并生成新令牌。

如果您要使用令牌生成模型,则需要确保令牌不易被猜到。对于那些随机的字母数字字符串,我通常只使用类似这样的东西:

$randomLongString = hash('sha384', microtime() . uniqid() . bin2hex(random_bytes(10)));

对于过期时间,可以记录token table被访问的时间戳,存储在同一个token的列中。如果旧的时间戳+(过期时间)>现在的时间戳,那么你就知道令牌已经过期了。 Return a 401。如果不使用当前时间戳更新旧时间戳,则 return a 200。

这些是适用于单一服务器设置的相对简单但有效的解决方案,并且依赖于用户仍然是同一用户这一事实。您可以做的其他事情是在生成令牌之前进行 IP 检查、设备 ID 验证。如果其中任何事情在此过程中发生变化,您可以快速使令牌无效并为用户提供一种方式来证明他们是他们声称的真实身份。