我有一个在 php WebSocket 服务器上运行的聊天应用程序。
当客户端连接时,我向他发送一个带有其他用户 ID 和昵称的对象。我需要发送这些 id,以便当用户说某事或断开连接等时,其他用户可以知道谁说过或断开连接等。
服务器端我使用 SESSID,因为我使用$_SESSION
数据,但我当然不能公开 SESSID 的列表。
那么,我可以使用md5($userId)
($userId
SESSID 在哪里),还是可以从它的 md5 哈希中劫持一个会话?
在这种情况下使用的任何散列函数都是不安全的,选择 MD5 作为散列函数意味着您不了解与加密函数相关的最佳实践。MD5 已被破坏多年,永远不应该用于任何事情。(即使 sha1 更安全、更快,但您可能也不应该使用 SHA1)。
这有很多问题。最值得注意的是,这应该很容易破解,因为任何小数字都应该在彩虹表中。攻击者应该知道每个SESSID
值。作为会话 ID,使用 PHP 的session_start()
. 如果您需要令牌,请使用加密随机数。如果您不了解哈希函数的基础知识,请不要使用哈希函数。
哈希不是最好的安全性,在大多数情况下我不会推荐它。
但在这种情况下,有一个区别:
所有 SSID 都是无稽之谈(我的意思是它们是随机的)所以如果你添加所需的盐来制作你的
salt.length + $userId.length
超过 32 个字符(为了安全起见,使其超过 128 个字符),在逻辑上不可能解密哈希。解密它就像从它的哈希中重建一个文件! 这是不可能的
为了让事情变得更容易,这里是您需要的代码:
function YourNewHashMaker($str)
{
return sha1(md5("Some Random Salt".$str).$str."Another Random Salt!".sha1("This one is too much".$str));
}
像这样使用它:
YourNewHashMaker($userId);
这里唯一的安全漏洞是有人窃取您的代码并开始制作彩虹表的可能性,这是一件非常困难的事情。以及所有其他哈希的相同安全漏洞。
编辑:请记住,无论您有什么想法必须制作自己的hashmakers,请记住输出字符串必须由经过批准的算法生成。换句话说,不要在 'sha1(....)' 之前或之后添加任何东西,就在函数内部。
希望能帮助到你。