Php 如何以一致的方式加密主键

Php 如何以一致的方式加密主键,php,mysql,encryption,Php,Mysql,Encryption,我有一个数据库表,它有一个简单的递增整数作为主键(1,2,3等等)。这些数字代表一所大学的校友,记录中有个人信息。我被要求在向用户显示每个记录时(在用户查询数据库之后)为每个记录提供一个唯一的ID,但ID不能是主键,而且必须一致 例如,如果有人检索到具有任意ID 88gh344r的记录,然后再次进行搜索并检索到记录88gh344r,他们需要能够说“这是同一个人”。由于人们需要能够识别从一个搜索到下一个搜索的标识符,因此ID不能长而复杂 我想到了三种方法: 创建一个包含主键和随机数字序列的额外表,

我有一个数据库表,它有一个简单的递增整数作为主键(1,2,3等等)。这些数字代表一所大学的校友,记录中有个人信息。我被要求在向用户显示每个记录时(在用户查询数据库之后)为每个记录提供一个唯一的ID,但ID不能是主键,而且必须一致

例如,如果有人检索到具有任意ID 88gh344r的记录,然后再次进行搜索并检索到记录88gh344r,他们需要能够说“这是同一个人”。由于人们需要能够识别从一个搜索到下一个搜索的标识符,因此ID不能长而复杂

我想到了三种方法:

  • 创建一个包含主键和随机数字序列的额外表,并获取查询以检索与主键等价的随机数字

  • 使用MySQL的SHA2或AES加密主键,但它们会产生长字母和数字序列

  • 在查询中使用诸如PHP中的Base64加密之类的方法动态加密主键

  • 以下哪一个是最好的,或者我错过了一个更好的方法?

    不要太复杂

    考虑这一点:

  • 为用户提供了一个备用映射键。这可以是临时会话映射和/或辅助唯一密钥(但不是PK,可能在同一个表中,也可能不在同一个表中),当然,对于域来说应该是唯一的

  • 访问令牌,每个项随机生成,但不需要唯一,它与公开id的简单PK结合。如果需要,可以通过适当的转换使其在值之间看起来非常漂亮。访问令牌也可以被视为单独的值

  • 我喜欢第二种方法。在这两种情况下,虽然第二种形式的耦合更多,但暴露的不是“直接PK”

    这两种方法都可以防止根据序列“知道”下一个密钥,但猜测/暴力与域的大小有关:正如其他人所说,这不应该用作主要安全层


    愉快的编码。

    例如,你可以在用户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
    ,你可以从中为每种语言安装它。它的选项有:

  • 从名为salt的键生成encrytion字符串
  • 定义字符串的最小长度,例如8位数,它对于base64_encode()等函数不可用
  • 对字符串进行反向解码
  • 定义所需的字母表,例如a-z。(注意,必须至少定义16个字母)

  • 注意:对于
    php
    建议为您的网站主机激活
    bcmath
    GMP
    扩展,但是它在没有
    GMP

    的情况下工作,如果(用户|权限){//show stuff}或者{exit;}怎么办?在这种情况下访问控制是什么?任何人都可以自由搜索数据库-没有其他类型的登录或授权。只要人们没有得到主键,其余的信息就可以了。@Beasley:为什么最终用户看不到主键?这是一个数字。刚刚在下面发布了:我需要加密主键,因为有一个发布的校友登记册使用完全相同的编号系统!如果我不加密它们,人们只需查阅打印的登记簿中的数字2(例如)就可以知道它是谁。该网站将成为学术界的资源。他们想查看个人信息,但对到底是谁不感兴趣。例如,他们只是想知道有多少1959年毕业的人成为了教师。打印的登记簿包含姓名,但个人信息很少。谢谢