使用SHA256密钥

时间:2015-07-13 16:19:38

标签: php security

我使用Doctrine ORM构建应用程序,出于某种原因,我需要在URL中放置DQL查询。我知道。这听起来很糟糕,但是......如果我要签署URL怎么办?我在考虑这样的事情:

如果我的网址是:
http://example.com/api/?sql=SELECT%20e%20FROM%20SomeEntity

我可以用一些秘密来散列这个网址:
$hash = hash('sha256', $url.$someLongSecretToken);

最后我的网址将如下所示:
http://example.com/api/?sql=SELECT%20e%20FROM%20SomeEntity&hash=5639543ff649aa1b799a99d7cbf509a850de5cb31835a22ee7a927560ce33c60

之后,在执行DQL之前,我可以从URL中删除哈希参数,再次使用哈希URL,并将哈希表格URL与刚刚计算出的哈希表格进行比较。如果哈希值相同,则表示此URL由服务器生成,不会被修改。

此解决方案是否安全?对我来说,只要sha256是安全的,$ someLongSecretToken将足够长,这个解决方案应该是安全的,但我对此感觉不好;)

1 个答案:

答案 0 :(得分:2)

不,这不安全。如果发现针对SHA256的冲突攻击,则散列将能够伪造。

要修复它,请用HMAC替换哈希:

hash_hmac('sha256', $url, $someLongSecretToken);

绝对使用时间安全比较:

if (hash_equals($signature, hash_hmac('sha256', $url, $secret))) {
    // It's good
}