Php 如何以一致的方式加密主键
我有一个数据库表,它有一个简单的递增整数作为主键(1,2,3等等)。这些数字代表一所大学的校友,记录中有个人信息。我被要求在向用户显示每个记录时(在用户查询数据库之后)为每个记录提供一个唯一的ID,但ID不能是主键,而且必须一致 例如,如果有人检索到具有任意ID 88gh344r的记录,然后再次进行搜索并检索到记录88gh344r,他们需要能够说“这是同一个人”。由于人们需要能够识别从一个搜索到下一个搜索的标识符,因此ID不能长而复杂 我想到了三种方法:Php 如何以一致的方式加密主键,php,mysql,encryption,Php,Mysql,Encryption,我有一个数据库表,它有一个简单的递增整数作为主键(1,2,3等等)。这些数字代表一所大学的校友,记录中有个人信息。我被要求在向用户显示每个记录时(在用户查询数据库之后)为每个记录提供一个唯一的ID,但ID不能是主键,而且必须一致 例如,如果有人检索到具有任意ID 88gh344r的记录,然后再次进行搜索并检索到记录88gh344r,他们需要能够说“这是同一个人”。由于人们需要能够识别从一个搜索到下一个搜索的标识符,因此ID不能长而复杂 我想到了三种方法: 创建一个包含主键和随机数字序列的额外表,
愉快的编码。例如,你可以在用户ID*100上进行36进制编码 用户标识26=208 用户标识3=8C
事实上,我刚刚在一个URL缩写器上写了一个简短的啧啧,该缩写器基于此工作,使用recid作为种子。您可以使用该功能创建查找密钥,并将其作为“参考”密钥存储在数据库中。代码是如果您这样做是为了保护隐私,那么您将面临一场重大的fsckup。用不了多久,最蹩脚的脚本小子就可以编写一个简单的程序,尝试所有可能的“散列”,加载整个列表
您应该研究适当的访问控制,以便人们只能看到他们允许看到的内容。您可以将散列或加密值截断到所需的长度,但两者都有冲突的风险。如果您有200万条记录,那么使用8个36进制数字,您大约有50%的记录。如果你不转换成base-36,只需要八个十六进制数字,你只需要8万条记录
对于随机数,您没有这个问题,因为您可以在列上设置唯一性约束,并在发生冲突时生成新的数字。如果我理解正确,您的主要目标只是不显示主键,而是在与用户通信时使用其他内容 最简单的方法: 向表中添加一个CHAR列,并选择其他标识符的长度,例如CHAR(16) 为该列指定唯一索引,这样就不会有任何重复项 对于每一行,生成长度为16的安全*随机*字符串并更新该行 不要散列普通主键。如果按键从1,2,3开始。。然后每个人都可以通过计算1,2,3的哈希值,将
id
与hash
匹配。。。。等
另一个问题是,例如,如果表中已有200行,并且添加了1,则攻击者可以自动将主键201与刚刚出现在列表中的随机字符串相关联
另一方面,为什么首先需要隐藏主键。也许你应该改为加密列中的个人用户数据?我在2个月的搜索后找到的简短答案是
hashids
,你可以从中为每种语言安装它。它的选项有:
注意:对于
php
建议为您的网站主机激活bcmath
和GMP
扩展,但是它在没有GMP的情况下工作,如果(用户|权限){//show stuff}或者{exit;}怎么办?在这种情况下访问控制是什么?任何人都可以自由搜索数据库-没有其他类型的登录或授权。只要人们没有得到主键,其余的信息就可以了。@Beasley:为什么最终用户看不到主键?这是一个数字。刚刚在下面发布了:我需要加密主键,因为有一个发布的校友登记册使用完全相同的编号系统!如果我不加密它们,人们只需查阅打印的登记簿中的数字2(例如)就可以知道它是谁。该网站将成为学术界的资源。他们想查看个人信息,但对到底是谁不感兴趣。例如,他们只是想知道有多少1959年毕业的人成为了教师。打印的登记簿包含姓名,但个人信息很少。谢谢