2015-10-24 197 views
1

我正在创建一个移动REST API。我需要加密秘密访问密钥吗?

当前,当用户使用电子邮件和密码登录时,我生成密钥会话密钥(64个字符长),将其存储在数据库中并发送给用户,以便用户无需再次登录以便将来请求,直到他们注销。

对于下一个请求,我只是检查提供的会话密钥是否与数据库中的密钥相同。

但是,我在这个方案中看到了一个很大的安全漏洞。如果攻击者能够访问数据库,他们可以使用密钥并冒充任何人而不知道密码。除了掩盖用户的真实密码之外,在这种情况下加密密码有什么意义 - 它不会阻止其他任何事情。

所以,我的问题是你如何正确存储这些访问密钥?

Twitter将在其API上登录时发送会话密钥。那么,他们如何存储这些密钥?

谢谢。

回答

0

它甚至更好散列会话密钥,就好像它是一个密码,并将散列值存储在数据库中。

password hashing唯一的区别在于,由于您的会话密钥(我希望至少)是由secure random number generator生成的并且时间足够长以至于无法通过蛮力推测(我推荐至少128位随机性),所以,你:

  • 不需要单独的盐,和
  • 可以用一个简单的cryptographic hash function像SHA-256,而不是像PBKDF2故意缓慢的密码散列方案。

不使用salt也允许您使用(散列)会话密钥在数据库中查找会话记录,因此您不需要单独的会话ID。

所以,总结一下:

  1. 当开始一个新的会话,使用安全RNG产生会话密钥,存储在数据库中的会话密钥的SHA-256散列,并发送(非哈希)会话密钥给客户端。

  2. 当客户端发出请求时,使用SHA-256散列客户端发送的会话密钥,并在数据库中查找相应的记录。

您也可能希望限制会话密钥的生命周期,并提供一些机制,为客户明确地无效所有的用户会话,以减轻个人会话密钥的一个折中的效果。

+0

但是这个方案不允许从多个设备登录到同一个帐户,除非我有一对多关系数据库表的会话密钥。因为在第二次登录时,我们不会再知道(非哈希)会话密钥。是对的吗? – moeseth

+0

@moeseth:对,您无法以这种方式在多个客户端设备之间共享相同的会话密钥。通常,人们会将这些视为单独的*会话*属于相同的*用户*。 –

相关问题