我有一些可以轻易猜到的顺序ID。如果有人想看到与这个id相关的数据,他必须通过我以前给过他的令牌来证明他的访问权。
token = md5(secret_key + md5(id))
MD5对这项工作是否足够好?
答案 0 :(得分:5)
从技术上讲,连接之前甚至不需要md5 id以确保足够安全。
但是我通常建议使用sha-256或sha-512,除非有一些严重的性能问题(比如嵌入式编程)。
答案 1 :(得分:3)
这实际上取决于你想要保护的东西,但可能不是。我认为没有任何理由不使用更强的散列函数。
答案 2 :(得分:3)
假设这用于身份验证,我会使用HMAC。请参阅示例FIPS PUB 198。例如,这允许您使用安全散列函数(而不是MD5),按描述截断结果并仍然获得安全令牌。
答案 3 :(得分:2)
不要使用MD5。它被打破。我无法相信所有人的VeriSign仍然使用MD5。有一些测试套件可用于确定MD5的哈希冲突,以用于破坏MD5哈希比较。
绝对最少使用SHA-1。我建议使用SHA-5。
答案 4 :(得分:1)
如果ID很容易被猜到,除非密钥很长,否则这不是很安全。
对于6个字符的secret_key,我的电脑可以在大约一天内根据MD5强制执行secret_key值。能够访问更快/更多计算机的人可以大大缩短时间。对于密钥中的每个附加数字,中断时间增加10倍。由于可以很容易地猜到ID,因此计算出它的MD5值,因此不会增加反转的难度以获得secret_key。
答案 5 :(得分:1)
我建议使用替代解决方案,或者(如果不可接受的话)在md5生成例程中添加更多数据。如果您的secret_key是常量,并且我能够对一个哈希进行反向工程,那么我可以为任何其他ID生成正确的密钥。
如果您将存储有数据的随机盐以及当前时间(如果与您正在保护的记录相关联)构建到md5代中,那么它将大大增加攻击的难度。
请参阅: