我有一个rails应用程序,我们使用user_id并写入会话变量(作为cookie)。我将对浏览器和移动平台使用相同的令牌。
生成身份验证令牌的首选方法是什么?我见过:
token = Digest::MD5.hexdigest('some-value') # this
token = SecureRandom.urlsafe_base64 # and this
token = SecureRandom.hex # and this
是否有一个重要的理由使用一个而不是另一个?
事先提前答案 0 :(得分:2)
除了Rails的上下文(因为我们在这里谈论一般的Web应用程序安全性),它很容易辨别。
因此,使用MD5,您有两种方法。使用固定输入或随机输入。为了便于讨论,任何包含随机组件的输入(如附加了随机属性的用户名)都被认为是随机的。
固定输入法不好。原因是它最终会在某种程度上可预测。如果攻击者可以预测他/她的令牌(了解它是如何生成的),他可以使用它来攻击其他令牌。换句话说,对每个人来说都是糟糕的一天。
随机输入法与纯随机令牌方法没有什么不同,只是部分输入不是随机的。
所以我建议使用纯随机令牌。 base64或hex都可以,但是令牌中应该至少有128位随机性(16个字符),如果可以,则更多。一个很好的基础是256位随机性,在base64中是43个字符......