医疗健康数据身份信息加密

发布时间 2023-06-15 17:03:19作者: Rswxgs

1. 算法构想

由于医院的数据涉及到隐私问题和防止个人信息泄露被恶意使用,那么就选择对其中的个人id也就是身份证号进行加密,选用单向加密算法,无法被解码,并且不需要密钥。但是由于一些理论上的漏洞会产生一些问题:

  • 使用的数据加密可能会被暴力破解法进行破解掉,如何尽量减少穷举法能够破解掉的概率。

  • 加密产生的字符串是固定的,如何避免产生的字符串会产生重复。

对于第一个问题:

  1. 第一个解决办法,产生一个随机数,对于一部分数据都会有一个随机数a,a的范围可被设置,让每个excel加密的轮次都循环a次,每个excel循环的次数是不一样的。或者对每个excel中的需要加密的元素都进行不同加密伦次的区分。

  2. 第二个解决办法,从加密的方法上进行改动,每个加密算法结果进行二次加密使用不同的加密算法,或者采用三次四次的加密。

  3. 第三个解决办法,也是最安全,加密随机性最大的一个,每个加密的数据都使用不同的加密伦次a,a的生成随机的,并且设定一些不同的加密算法,不同伦次会调用第i种加密算法,i的值是加密算法的值。最后得到的结果进行字符串截取,截取一样的位数。

对于第二个问题:

  1. 常见的一些加密算法md5算法,一共有128bit字节,也就是产生32位16进制的数据进行输出,所以其实最终的变化还是一定的2的128次方的变化是可能出现“撞车”的情况,特别是我们有几十万条数据的时候还是有可能会出现的,所以我们选择加密时md5使用一次,sha1再使用一次,产生160bit字节数据长度的字符串。

  2. 还有sha256和sha512也是可以可以被考虑的对象,但是一件很最重要的事情是越安全的算法越慢,加密时所用的时间越长。

身份证号时18位的字符串,如果说输入的是123456789的字符串,撞车的概率会很大,但18位的身份证号撞车的概率会大大减小。

2. 代码编辑

考虑到实际的使用流程,医院的数据是两种:结论数据和原始数据。我们后面需要根据加密后的唯一id对两种数据进行查找和拼接。如果说采用不同随机伦次的方法,并不能保证结论数据中的文件1和原始数据中的文件1能够采用相同的加密方式之后得到对应的id。所以采用固定方式的id加密,先使用md5加密,再选用sha1进行加密一次,再选用sha256加密一次(或者加密两次,3次的时间复杂度可能会很高)。

由于上述的加密方法采用的是摘要的方式,所以对于输入不同身份证号,基本不会撞车。

最后选用了三次加密md5,sha1和sha256加密三次得到最后结果,代码如下:

import hashlib


class Hash:
   def encryption_str(self, excel_str):
       # 创建了一个md5算法的对象
       hash_md5 = hashlib.md5()
       # 运送原材料喽,要对哪个字符串进行加密,就放excel_str这里
       hash_md5.update(bytes(excel_str, encoding='utf-8'))
       # 产出hash值,拿到md5加密后的字符串
       encry_result_md = hash_md5.hexdigest()

       # 使用sha1加密第二次
       hash_sha1 = hashlib.sha1()
       hash_sha1.update(encry_result_md.encode())
       encry_result_sha1 = hash_sha1.hexdigest()

       # 使用sha256加密第三次
       hash_sha256 = hashlib.sha256()
       hash_sha256.update(encry_result_sha1.encode())
       encry_result_sha256 = hash_sha1.hexdigest()

       return encry_result_sha256