我在这里发现了许多问题/答案以及其他网站上的很多文章,但我还有一些问题需要在开始之前回答,而我却找不到答案。我想为移动应用程序(以及一些前端)创建restful api。
我选择通过HTTPS进行基本身份验证,因为我觉得现在已经足够了,而且看起来很容易实现。所以我应该在dabatase中保存用户名和哈希密码吧?然后,当用户在应用程序中写入用户名和密码时,我会对密码进行哈希处理,并且都由Base64加密并添加到HTTP标头对吗?我如何解密这个并在服务器端检查数据库?如何用盐改变?
在我使用之前的通话检查用户名和密码后,我该如何保存此会话?我应该创建一些session-id/token
(随机字符串)并将其保存到users表中的列并将其发送回移动应用程序,然后将其用于其他调用(有一些时间戳到期)?可能是通过HTTP(没有安全)?像web.com/api?token=ASsF234Silkj&data=...
或者我必须在身份验证后始终使用HTTPS?
当我在使用此API的所有应用中使用某些API密钥(私有)时,它会如何变化?我知道我可以隐藏密钥而不是通过请求发送它(仅用于加密)但是如果有人试图阅读.apk
并获取API密钥会怎么样?
答案 0 :(得分:1)
所以我应该在数据库中保存用户名和散列密码吗?
是的,你应该哈希它,不要使用MD5或SHA1,它们现在不再安全。使用SHA2或SHA3。
然后,当用户在应用程序中写入用户名和密码时,我会对密码进行哈希处理,并且都通过Base64进行加密并添加到HTTP标头中吗?
Base64不是哈希函数,你可以从base64获取原始内容,它只是一种编码方式。是的,你必须把凭据放到HTTP头。在发送用户名和密码(哈希或普通)时,请使用HTTPS连接。 在HTTP连接中发送哈希容易受到重播攻击。
如何解密此问题并在服务器端检查数据库?如何用盐改变?
如果您发送Hash,则无法对其进行解密(这是Hash的唯一目的)。我建议你关注: 1)通过https将用户名和密码发送到服务器 2)在服务器上创建哈希并检查数据库中的现有哈希值。
在我通过之前的通话检查用户名和密码后,我该如何保存此会话?
取决于您使用的语言
我应该创建一些session-id / token(随机字符串)并将其保存到users表中的列并将其发送回移动应用程序,然后将其用于其他调用(有一些时间戳到期)?可能是通过HTTP(没有安全)?
你可以这样做但是使用HTTPS,并且不使用时间戳,这是非常不安全的。而是生成长随机字符串
当我在使用此API的所有应用中使用某些API密钥(私有)时,它会如何变化?
???
我知道我可以隐藏密钥而不是通过请求发送它(仅用于加密)但是如果有人试图读取.apk并获取API密钥会怎么样?
不要把钥匙放在APK中,如果它是私钥就在本地生成(如果我明白你的意思)
答案 1 :(得分:1)
首先, base64 不加密
虽然可以将基本的http身份验证与会话集成,但这不是一项简单的任务。并且非常很容易得到一些不安全的东西(特别是从你问题中证明的技能水平来判断)。
你似乎已经计划好了你想要实现的大部分内容 - 但你已经把大部分内容弄错了。
在身份验证后是否应继续使用HTTPS取决于您的服务是否具有任何内在价值。
类似地,您如何在安全模型上实现代理身份验证令牌(包括API密钥)。坚持在任何地方使用HTTPS,您不必担心更改/加密API密钥。