PHP - 用于具有身份验证的手机的RESTful API


PHP - RESTful API for mobiles with authentication

我在这里找到了很多问题/答案,在其他网站上也找到了很多文章,但我还有一些问题需要回答,然后才能开始,我只是找不到答案。我想为移动应用程序(以及一些前端)创建 restful api。

我选择通过HTTPS进行基本身份验证,因为我想它现在已经足够了,而且看起来很容易实现。所以我应该在dabatase中保存用户名和散列密码,对吗?然后,当用户在应用程序中写入用户名和密码时,我散列了密码,并且都通过Base64加密并添加到HTTP标头,对吗?如何解密并检查服务器端的数据库?盐会如何变化?

在我用以前的电话检查用户名和密码后,我该如何保存此会话?我是否应该创建一些session-id/token(随机字符串)并将其保存到用户表中的列并将其发送回移动应用程序,然后将其用于其他调用(带有一些过期时间戳)?可能是通过HTTP(不安全)吗?喜欢web.com/api?token=ASsF234Silkj&data=...或者我必须在身份验证后始终使用 HTTPS?

当我在所有使用此 API 的应用程序中使用某些 API 密钥(私有)时,它将如何变化?我知道我可以隐藏密钥并且不通过请求发送它(仅用于加密),但是如果有人尝试读取.apk并获取 API 密钥怎么办?

首先,base64 不是加密

虽然可以将基本的http身份验证与会话集成,但这不是一项简单的任务。而且很容易得到一些不安全的东西(特别是从你的问题中证明的技能水平来看)。

你似乎已经计划好了你想要实现的大部分目标 - 但你已经错了大部分。

身份验证后是否应继续使用 HTTPS 取决于服务是否具有任何内在价值。

同样,实现代理项身份验证令牌(包括 API 密钥)的方式也会在安全模型上倾斜。坚持在任何地方使用HTTPS,您不必担心更改/加密API密钥。

所以我应该将用户名和散列密码保存在数据库中,对吗?

是的,您应该对其进行哈希处理,不要使用 MD5 或 SHA1,它们现在不再安全。使用 SHA2 或 SHA3。

然后,当用户在应用程序中写入用户名和密码时,我散列了密码,并且都通过Base64加密并添加到HTTP标头,对吗?

Base64不是哈希函数,可以从base64获取原创内容,它只是一种编码方式。是的,您必须将凭据放入HTTP标头。发送用户名和密码(哈希或纯文本)时,请使用 HTTPS 连接。在 HTTP 连接中发送哈希容易受到重放攻击

如何解密并检查服务器端的数据库?盐会如何变化?

如果你发送哈希,你不能解密它(这是哈希的唯一目的)。我建议您以下几点: 1) 通过HTTPS将用户名和密码发送到服务器 2) 在服务器上创建哈希并检查数据库中的现有哈希。

在我用以前的电话检查用户名和密码后,我该如何保存此会话?

取决于您使用的语言

我是否应该创建一些会话 ID/令牌(随机字符串)并将其保存到用户表中的列并将其发送回移动应用程序,然后将其用于其他调用(带有一些过期时间戳)?可能是通过HTTP(不安全)吗?

你可以这样做,但使用HTTPS,不要使用时间戳,这是非常不安全的。而是生成长随机字符串

当我在所有使用此 API 的应用程序中使用某些 API 密钥(私有)时,它将如何变化?

???

我知道我可以隐藏密钥并且不通过请求发送它(仅用于加密),但如果有人尝试读取.apk并获取 API 密钥怎么办?

不要将密钥放在APK中,如果它是私钥,则在本地生成(如果我明白你的意思)