【问题标题】:Do I need to encrypt secret access key?我需要加密秘密访问密钥吗?
【发布时间】:2015-10-24 20:01:44
【问题描述】:

我正在创建一个移动 REST API。

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

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

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

那么,我的问题是如何正确存储这些访问密钥?

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

谢谢。

【问题讨论】:

    标签: database security


    【解决方案1】:

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

    与password hashing 的唯一区别在于,由于您的会话密钥(我希望,至少)是由secure random number generator 生成的,并且足够长,以至于无法通过暴力破解(我建议至少 128 位随机性),你:

    • 不需要单独的盐,并且
    • 可以使用简单的cryptographic hash function,例如 SHA-256,而不是故意使用慢速密码散列方案,例如 PBKDF2。

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

    所以,总结一下:

    1. 开始新会话时,使用安全的 RNG 生成会话密钥,将会话密钥的 SHA-256 哈希存储在您的数据库中,并将(未哈希的)会话密钥发送给客户端。

    2. 当客户端发出请求时,对客户端发送的会话密钥使用SHA-256进行哈希处理,并在数据库中查找对应的记录。

    您可能还希望限制会话密钥的生命周期,并为客户端提供某种机制来显式地使所有用户的会话无效,以减轻个别会话密钥泄露的影响。

    【讨论】:

    • 但是这个方案不允许从多个设备登录同一个帐户,除非我有会话密钥的一对多关系数据库表。因为在第二次登录时,我们将不再知道(未散列的)会话密钥。对吗?
    • @moeseth:是的,您不能以这种方式在多个客户端设备之间共享相同的会话密钥。通常,人们会将它们视为属于同一用户的单独会话。
    猜你喜欢
    • 1970-01-01
    • 2020-04-10
    • 2022-06-28
    • 2017-03-23
    • 2021-12-25
    • 1970-01-01
    • 2020-03-24
    • 2018-01-13
    • 2022-12-03
    相关资源
    最近更新 更多