对信息数据加密方法的一些拙见

前言

前几天有一个学弟问了我这么一个问题

Generating keys requires the users to collect enough random data, it is well known that user generated secret keys are mostly with bad quality, i.e., easy to predict. Suppose USYD implements a secure communication system, and the university admin wishes to establish a secure channel for each of the student to Canvas, i.e., the university wishes to generate/share a secret key with each of the student. On the other hand, the university only wishes to store one single short secret msk, i.e., creating a different key for each student and store all of them in the server is NOT an option. What should the university do to produce a key for each student without the need to store all of them? Suppose there are in total 50,000 students, and the university only wishes to store one 128-bit master secret. Briefly explain your solution. The above is actually a standard functionality of a key distribution center. (Hint: each student has a unique and public sid)

我简单读了一下就是说有一个学校想要存储50000名学生的信息,并对信息加密保证学生信息安全,但是又不想每一个学生一个单独设立一个秘钥,因为服务器只能存储128bit的加密数据,问怎样在符合要求的条件下实现加密。

由于对加密协议的回顾又勾起了我的表达欲望,所以就有了这篇文章。

对于这个问题的解答想必如果大家在读完这篇文章后就会有自己的答案了。

举例

场景一

条件与要求

公司A想要存储员工的公司内部网站的账号密码。

分析

这是一种非常常见的信息加密需求,现在常见的手段就是使用非对称的信息加密技术。

实现

对于员工的账号密码(通常只加密密码)进行非对称加密后(如MD5)再进行存储,被加密存储的信息无法被还原,当员工发出登录请求后,服务器会对员工输入的账号密码进行加密,随后将加密后的结果与出具库内存储的加密信息进行匹配,如果数据相同就视为登录成功。

缺点

非对称加密后的数据无法还原是起优点但也是他的局限性,因为经过加密的数据无法被还原,所以这种加密手段无法用于加密需要访问查看的数据,比如个人信息,通常只是用于加密账号密码一类只需判断信息对不对,无需判断信息内容的信息。

**极端情况:**同一算法下的非对称加密后的数据是唯一的,如果加密后的数据被得知,且知道加密算法的情况下不排除被爆破出明文的风险。非对称加密算法还有一个缺点,就是两个完全不同的数据被加密后的结果有极小概率是相同的,虽然是极小的概率事件但是也是不能被忽视的。

场景二

条件与要求

公司A想要存储员工的个人信息,能保证员工本人可以正常访问自己的个人信息,公司服务器存储空间庞大,且不考虑服务器利用率。

分析

对于这种财大气粗的公司想要管理好员工的数据我们还是可以想到很多管理手段的。

实现一
加密流程

公司A有一个自己的秘钥key1,员工X自主设置一个秘钥key2,员工X将未加密的个人信息和key2发送给A,A将未加密的员工信息用key1加密后得到加密包,再用非对称加密算法将key2加密成key3,A将key3和加密包一起存储到服务器之中

解密流程

员工X输入key2,公司A将key2非对称加密算法加密得到key4,然后比较key3与key4,如果key3=key4,A使用key1将X对应的加密包解密,随后将解密的X的个人信息发送给X。

缺点一

公司A需要花费多余的空间存储key3,增加了存储成本,且数据都是通过key1,加密,如果key1泄露,那么被加密数据包被脱库后所有的员工信息将都会被泄露。

实现二
加密流程

公司A有一个自己的秘钥key1,员工X自主设置一个秘钥key2,员工X将未加密的个人信息和key2发送给A,A将未加密的员工信息用key2加密后得到加密包1,再用key1对加密包1进行加密得到加密包2,最后A将加密包2存储到服务器之中。

解密流程

员工X向公司A发出查看个人信息的请求,公司A将对应X的加密包2使用key1进行解密得到加密包1,随后A将加密包1发送给X,X得到加密包1后输入key2解密加密包1得到X的个人信息。

缺点二

缺少对请求者身份的验证,存在其他人冒充X获取加密包1,随后爆破加密包1得到X的个人信息的可能。但是这里要注意一点,虽然没有身份验证,但是服务器不可能允许某ip短时间内大量请求多名员工的查询信息,且黑客至少知道员工X的基本信息(比如工号)才能请求查询,这样批量的信息获取成本也是极高的。

如果员工X本人忘记了key2,那么他无法进行找回密码,他的个人信息将会被作废,只能重新录入。

答疑:

既然只要一向A请求A就会把加密包2解密,那么key1还有什么存在的必要?

大家可以考虑这样一个种情况,公司A被脱库,得到了所有员工的加密包2,但是由于不知道key1,只能靠爆破的方法来猜测,但是由于每一个被key1加密前的数据(即数据包1)都是由公司员工的独立秘钥key2所加密后的数据,所以无论黑客如何爆破得到的都是加密的数据,无法判断是否爆破成功。再极端一点,公司A被脱库,且key1也被泄露,那么黑客可以利用key1解密所有数据包2得到数据包1,但是由于每个数据包1的加密密码是独立的,所以黑客爆破成本极高,这样就能最大限度地防止信息泄露造成的损失。

实现三
加密流程

公司A有一个自己的秘钥key1,员工X自主设置一个秘钥key2,员工X将未加密的个人信息和key2发送给A,A将未加密的员工信息用key2加密后得到加密包1,与此同时A使用非加密对称手段将key2加密为key3,A再使用key1对加密包1进行加密得到加密包2,最后A将加密包2和key3存储到服务器之中。

解密流程

员工X输入key2,公司A将key2非对称加密算法加密得到key4,然后比较key3与key4,如果key3=key4,A使用key1将X对应的加密包2解密得到加密包1,再用key2对加密包1进行解密得到X的个人信息,最后A将X的个人信息发送给X。

缺点三

这个方法集成了方法一和方法二的优点,但是同时也集成了方法一和二的缺点。

公司A需要花费多余的空间存储key3,增加了存储成本。

如果员工X本人忘记了key2,那么他无法进行密码找回,他的个人信息将会被作废,只能重新录入。

场景三

条件与要求

公司A想要存储员工的个人信息,能保证员工本人可以正常访问到自己的个人信息,公司服务器质量差,存储空间小,且没有非常专业的员工进行服务器的维护(维护者只了解一些基本的维护操作),同时还想要降低成本。

分析

这种条件较差的服务器我能想到的处理方式有两种:第一种是雇佣第三方的专业信息存储公司B,第二种是实现员工信息的去中心化。

这里要引入一个特征码T的概念,特征码其实也是一段密码,但是不用于数据的加密,而是用于身份的校验,为了与密钥key区分,所以另起名为特征码T。

实现一
加密流程

公司A有一个自己的密钥key1,被雇佣的可信任第三方公司key2,员工X自主设置一个特征码T,员工X将未加密的个人信息和T发送给A,A使用key1将未加密的个人信息和T加密得到数据包1,随后A将数据包1发送给B,B使用key2将数据包1加密得到数据包2,最后B将数据包2存储到B的服务器中。

解密流程

员工X输入特征码T1(由于还不确定是否是X本人需要对特征码进行校验,为防止混淆,这里称为T1,实际上就是T),A收到请求后暂时存储T1并向B发出请求,B收到请求后使用key2将加密包2解密得到加密包1,随后B将加密包1发送给A,A使用key1解密加密包1得到X的个人信息和特征码T2,随后A将T1与T2进行比较,如果T1=T2,A将X的个人信息发送给X。

缺点一

公司A没有在请求时就对请求者的的身份进行验证,而是在与公司B完成数据交互后才进行验证,如果黑客恶意发出多次请求会增加服务器负担。

公司B没有对公司A进行验证,存在B直接将加密包1发送给伪造成A的黑客的风险。

实现二
加密流程

公司A有一个自己的密钥key1,被雇佣的可信任第三方公司有一个自己的密钥key2,员工X自主设置一个特征码T1,员工X将未加密的个人信息和T1发送给A,A使用key1将未加密的个人信息加密得到数据包1,同时A使用非对称加密算法对T1进行加密得到T2并存储在A的服务器上,随后A将数据包1发送给B,B使用key2将数据包1加密得到数据包2,最后B将数据包2存储到B的服务器中。

解密流程

员工X输入特征码T1,A收到请求后将T1使用非对称加密算法得到T3,如果T2=T3,则A向B发送请求,B收到请求后使用key2对数据包2进行解密得到数据包1,并将数据包1发送给A,A使用key1解密数据包1得到x的个人信息,最后A将个人信息发送给X。

缺点二

增大了公司A服务器的存储成本,但是比直接存储员工的个人信息要强很多。

依然没有解决公司B没有对公司A进行验证,存在B直接将加密包1发送给伪造成A的黑客的风险。

实现三
加密流程

加密前准备:公司A有一个自己的特征码T0,公司A将T0发送给公司B,公司B使用key2加密T0得到加密包01,并使用非对称加密算法将T0加密得到T01,最后B加密包01返回给A,A使用key1将加密包01加密得到加密包02,最后A将加密包02存储在自己的服务器上。

公司A有一个自己的密钥key1,被雇佣的可信任第三方公司有一个自己的密钥key2,员工X自主设置一个特征码T1,员工X将未加密的个人信息和T1发送给A,A使用key1将未加密的个人信息加密得到数据包1,同时A使用非对称加密算法对T1进行加密得到T2并存储在A的服务器上,随后A将数据包1发送给B,B使用key2将数据包1加密得到数据包2,最后B将数据包2存储到B的服务器中。

答疑:

为什么A还要对数据包01进行一次加密再存储?

A之所以用key1对加密包01进行了加密,是为了遵守“不把鸡蛋放到一个篮子”的原则,key1和加密包02肯定是分开存储的这样可以降低风险,设想一下,A没有对加密包01进行加密而存储的就是加密包01,那么如果黑客成功窃取了加密包01那么黑客就可以绕过公司A,冒充公司A直接向公司B索取数据。

为什么加密包02中存储的是未加密的公司A特征码T0,而公司B存储的是非对称加密的T01?

这里其实存在争议但是都有各自的道理:一种观点认为直接存储T0即可,因为加密包01是用key2加密的,即使T0被窃取,黑客也需要窃取key2才能伪造加密包01,增加一步非对称加密增加了步骤的繁琐性;另一种观点认为使用非对称加密后基本可以杜绝黑客伪造加密包01的可能性。这二者各有优劣一个追效率,一个追求安全,至于是否使用一次非对称加密就酌情处理吧。

解密流程

员工X输入特征码T1,A收到请求后将T1使用非对称加密算法得到T3,如果T2=T3,A使用key1对加密包02进行解密得到01,,A再将加密包01发送给B,B使用key2对加密包0解密得到T02,随后使用非对称加密算法得到T03,如果T01=T03,则使用key2对数据包2进行解密得到数据包1,并将数据包1发送给A,A使用key1解密数据包1得到x的个人信息,最后A将个人信息发送给X。

缺点三

增大了公司A服务器的存储成本,但是整体成本和对公司A服务器的需求已经降到了足够低的水平。

实现四
加密流程

加密前准备:公司A在服务器中分出两块区域区域A1和区域A2,A1和A2数据存储相互隔离仅可以相互传递数据,A1有一个自己的密钥key1,A2有一个自己的密钥key2,A1有一个功能,当有员工X上传信息时就会自动生成一个唯一的特征码T。

员工X将未加密的个人信息发送给A1,A1生成特征码T并使用key1将未加密的个人信息和T加密得到加密包1,A1将加密包1和T发送给A2,A2使用key2将加密包1和T加密得到加密包2,A2将加密包2发送给A1,A1再使用key1将加密包2和T加密得到加密包3,最后A1将加密包3发送给X,由X本人存储。

解密流程

员工X将加密包3发送给A1,A1用key1解密加密包3得到加密包2和特征码T1(由于还未校验是不是x本人所以先假设为T1,实际上就是T),A1将T1和加密包2一起发送给A2,A2用key2解密加密包2得到加密包1和特征码T2,然后A2对比T1和T2,如果T1=T2,则B将加密包1和特征码T2发送给A1,A1用key1解密加密包1得到X的未加密的个人信息和T3,如果T3=T2,则认定X是本人,就将X的未加密数据发送给X。

缺点四

缺点非常明显一旦加密包3被窃取那么员工X的个人信息就会泄露。

我称这种方法为去中心化的信息存储,这种方法公司的服务器仅仅承担计算和校验的工作,个人信息被分散到个人身上存储。

对于这个致命缺点有很多种解决方法:

①加密时员工X自己设置一个密钥key3,在最后一步加密时,A1使用key3将加密包2和特征码T加密生成加密包3。

②加密时员工X自己设置一个特征码TX,A1生成特征码T并使用key1将未加密的个人信息和TX加密得到加密包1,A1将加密包1和T发送给A2,A2使用key2将加密包1和T加密得到加密包2,A2将加密包2发送给A1,A1再使用key1将加密包2和T加密得到加密包3,最后A1将加密包3发送给X,由X本人存储。

③加密时员工X自己设置一个多用码D,A1生成特征码T并使用key1将未加密的个人信息和D加密得到加密包1,A1将加密包1和T发送给A2,A2使用key2将加密包1和T加密得到加密包2,A2将加密包2发送给A1,A1再使用D将加密包2和T加密得到加密包3,最后A1将加密包3发送给X,由X本人存储。

这三种方法的解密流程不多赘述大家自己捋一捋应该就明白了,但这三种方法其实都是在效率和安全性上相互取舍的所以无法准确定义哪个好哪个差。

这种方法还有一个缺点就是如果员工X本人将加密包3丢失后他的个人信息也会完全丢失,只能重新录入。

总结

看了这么多种实现方法大家可以看到没有真正所谓的最优方法,大家都要在安全性和效率上做出取舍。而且大家可以发现,无论是哪种方法如果员工自己将密码(特征码/密钥/加密包)泄露都会导致个人信息泄露,所以大家在平时注意自己的重要密码不要泄露才是安全性的最好保障,再巧妙严谨的加密逻辑也防不了“内鬼”。

信息数据的加密也是一种大概率性的安全,世界上没有绝对的安全,如果抬杠,黑客同时将所有的密钥key,特征码T,还成功脱库,并且能爆破出所有的非对称加密结果,那么。。。。。。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C1yas0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值