如何从 10 个长度的数字/字母医疗 ID 创建一个不可逆的唯一 ID?
Posted
技术标签:
【中文标题】如何从 10 个长度的数字/字母医疗 ID 创建一个不可逆的唯一 ID?【英文标题】:How to create a irreversible unique ID from a 10 length number/letter medical ID? 【发布时间】:2022-01-18 22:29:16 【问题描述】:我想从医疗 ID 创建一个唯一 ID。这听起来像是一个常见问题,但我无法在 *** 或 Google 上找到该主题。我是 python 新手,所以一个代码示例会很棒!
我有几个数据框,其中包含多达 400 万行,其中存在 5-6000 名不同的患者,我希望能够添加更多具有相同代码和唯一机会的患者(最多 500 万唯一患者) .在最终合并的数据集中,我总共获得了多达 1000 万行。
即使您知道医疗 ID 的格式,也几乎不可能对生成的唯一 ID 进行逆向工程
医疗 ID 由生日 (YYMMDD) 和四个只有数字 (0-9) 和/或字母 (A-Z) 的变量组成。
我已阅读有关该主题的以下帖子,但有些问题仍未得到解答:
Irreversible unique ID from String 这里描述了使用彩虹表修改唯一 ID 的可能性。他描述了使用盐来绕过使用彩虹表的可能性。不幸的是,盐是我最近使用的东西。
https://www.sohamkamani.com/uuid-versions-explained/ 如果我使用 UUID v1,它取决于当前计算机的 MAC 地址,这不是一个选项,因为相同的唯一 ID 应该相同,独立于它生成的计算机。 我真的无法解决使用 UUID v4 和彩虹表对唯一 ID 进行逆向工程的可能性,因为对于具有正确知识的人来说,很容易弄清楚医疗 ID 系统。
Generate ID from string in Python 使用哈希,这不是很容易逆向工程吗?
How to generate 8 digit unique identifier to replace the existing one in python pandas
所以我的要求是:
-
从医疗 ID 生成的唯一 ID
不可能用彩虹表反转它(非常重要,因为它是敏感信息)。
生成唯一 ID 时发生冲突的风险很小
不依赖于计算机中的 MAC 地址或其他独特的东西
相同的唯一 ID 将由相同的医疗 ID 生成,而与生成它的计算机无关。
理想情况下,长度为 10-20 位的唯一 ID,没有字母。但是如果它需要更长的字母(A-Z)和数字(0-9),那就这样吧:)
是否有任何解决方案符合上述要求? 如果上面提到的任何链接都没有我需要的东西,您能否提供一个代码示例?
示例:(DDMMYYXXXX) 2022 年出生的人的形象 ID
Medical ID Bloodsample Date
0 0101221234 5.2
1 0101224321 6.2
2 311222R09B 7.6
3 0203221234 3.8
4 311222R09B 5.7
5 0405229082 9.5
6 1012225879 7.2
7 2801226787 5.2
8 2706221HF9 6.3
9 3112228768 4.6
0 和 3,以及 2 和 4 是相同的患者。 4和7不是同一个病人。
【问题讨论】:
根据您描述的方案,我计算出大约 625 亿个可能的 ID - 如果您只考虑有限的出生年份范围,则会大大减少。鉴于您提出的要求,“不可逆转”不是一个合理的目标;无论选择何种算法,攻击者只需执行 625 亿次即可反转每个编码的 ID。 要使哈希更安全,请查看salting 和stretching。这些通常用于散列密码,但这些技术可以应用于任何需要比简单散列更高级别安全性的数据。 【参考方案1】:DDMMYYXXXX
此信息给出的出生日期可能是识别一小部分人的重要提示,并不适合匿名化
从医疗 ID 生成的唯一 ID...
您正在寻找的可能是hash 函数,加密散列函数(例如 SHA-256)是抗冲突的。这意味着为不同输入生成相同哈希值的概率应该可以忽略不计(但在数学上永远不会为零)。
不可能用彩虹表反转它(非常重要,因为它是敏感信息)。
加密哈希将无法反转该值。
当有一组已知的输入值时,彩虹表是有效的。对于输入集 MMDDYYXXXX,应该可以在合理的时间内生成所有可能的值。创建一个反向查找表
在这种情况下,您可以尝试使用HMAC,它是一个带有密钥的散列函数。
很遗憾,python 不是我的母语,所以你必须咨询你最喜欢的搜索引擎来搜索实现
【讨论】:
感谢您的回答。我将尝试看看结合 HMAC 的 SH-256,我认为这可以解决我的问题,但我没有找到任何有用的代码示例。因此,如果其他人有 python 代码示例,我们非常欢迎他们发帖 :)以上是关于如何从 10 个长度的数字/字母医疗 ID 创建一个不可逆的唯一 ID?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一列数组,其值来自一列并且它们的长度来自pyspark数据帧中的另一列?