如何从 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一组自定义对象(Swift)?

如何创建一列数组,其值来自一列并且它们的长度来自pyspark数据帧中的另一列?

从 Excel 填充访问记录

如何限制文本框输入长度

如何在 Postgres 9.6+ 中生成长度为 N 的随机、唯一的字母数字 ID?

如何创建一组具有在 SwiftUI 中编辑的单独变量的文本字段?