ftok()碰撞

时间:2011-09-07 11:23:15

标签: c linux shared-memory ftok

我正在使用ftok()为C应用程序使用的共享内存段生成标识符。我遇到了问题,在一个盒子上我遇到了root使用的标识符。我可以通过破解代码来解决这个问题,但我想要一个更强大的解决方案。

应用程序安装在自己的逻辑卷中,提供给ftok的路径是应用程序的二进制文件目录(在该lv中)。提供的ID从1开始,通常有半打左右。

我已经追踪到ftok会做这样的事情:

(id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff)

st.st_dev / st.st_ino的组合应该非常独特。但是我已经看过很多方框,st_dev的最低位通常是0(即st_dev数字通常是256的倍数)。并且由于二进制目录位于逻辑卷中,因此无法保证inode编号与root用户不同。

有没有一个很好的解决方法 - 更好的替代ftok,或者一种设置机器的方式,使得st_dev数字对ftok更有用?

2 个答案:

答案 0 :(得分:7)

您可能需要考虑使用POSIX共享内存(通过shm_open),它不受此类密钥冲突的影响

答案 1 :(得分:1)

您的应用程序应该始终能够处理关键冲突。一个密钥可能被另一个不相关的进程使用。但你可以尝试使用更相关的位来创建自己的ftok()版本。

理论上,任何应用程序只需要一个“主”键,指向可以找到其他键的“记分板”。在文件系统上公布masterkey可能是个好主意。崩溃后重新启动始终是一个问题。