文件加密和解密 - 密钥存储
当我们想要做一次加密系统,或者只是有一个关于这个问题,它是如何保存的加密和解密密钥。
一般认为想要的文件加密和解密,对称算法用于。一般是AES要么DES。
这就存在密钥管理的问题,它是如何?
基本上两种方式:
1. 加密,然后密钥信息保存在文件外。比方我们把C:\test.txt加密了,就生成一个密文。
然后把密钥保存在某个地方。比方数据库。我们能够在数据库里面添加一个记录,如:
path key
c:\test.txt 123456789
当要解密的时候,就依据路径到数据库里面去查找相应的key,再进行解密。这么做有一个比較麻烦的问题。就是假设用户把这个文件copy到另外一个文件夹,那么就须要更新数据库。这就相当于我们须要监控这个文件c:\test.txt的动态。
每一次移动copy什么的,都须要更新数据库,非常麻烦。
2. 定义一个自己的文件格式。
一般来说,会把密文放在自己定义文件的后面,前面加上一个文件头metadata。(也有把密文放在前面,metadata放在后面的)
这样的方式就会比第一种好一些,由于我们能够在metadata里面放入一些我们自己的数据。比方:密钥信息,tag啥的。
自己定义的文件格式就方便多了,假设用户移动了这个文件,也没关系,由于文件头metadata是跟着走的。
可是这里有个问题,就是metadata里面的某些信息是须要加密存放的。
我们总不可能把文件内容加密密钥明文放在metadata里面吧?假设这种话,仅仅要打开这个文件。就能够在头上看到加密密钥了。一下就能够解开密文了。
所以加密密钥本身也须要加密然后再放在metadata里面。
那么加密 “密钥”的密钥又放在哪里呢?
这个地方就须要有一个管理 (加密“密钥”的密钥) 模块。一般会把这个叫做KMC (Key Management Center)
加密 “密钥” 是使用非对称还是对称算法呢?
我认为都能够,详细看需求。
可是不管採用非对称还是对称算法。都须要一个KMC server。
假设是使用非对称算法的话,KMCserver须要产生一对key:公钥和私钥。把公钥发给client,client就能够用公钥把文件内容的密钥(如123456789...,AED256的话,就应该有32个字节)进行加密。然后把密钥密文放在metadata里面。
当须要解密的时候,有两种做法:a)把文件头(metadata)发给server。server用私钥把“文件内容密钥”解开,而且发回给client,这样client就能够用解开后的密钥解密文件内容了。
b) server把“文件内容密钥”密文相应的私钥发给client。client自己去解开得到文件内容密钥。然后再去解开文件内容。
假设使用对称算法加密“文件内容密钥”的话,也是类似的。
一个KMCserver肯定会有多个非对称密钥或者对称密钥的,所以。我们一般还须要一个id来标志密钥。通常的做法就是KMCserver会把公钥(非对称)或者密钥(对称)和相应的ID 发给client。client把文件内容密钥加密后。 KMC发过来的密钥就须要毁灭(以免在内存里面存在时间过长,而被人dump内存看到),然后把文件内容密钥的密文和相应id放在metadata里面。
举个样例,比方文件内容密钥是01234567890123456789012345678901
然后
1. 向KMCserver申请一个key(非对称,对称都行)
2. 用key把01234567890123456789012345678901进行加密可得xxxxxxxxxxxxx
3. 把key毁灭
4. 把密文xxxxxxxxxxx和相应的id比方10放到metadata。
例如以下图。
这样,当我们要解密的时候。能够把id:10发给KMCserver,KMCserver就会发回相应的key,然后就能够把xxxxxxxxx解开变成01234567890123456789012345678901了,这样就能够拿01234567890123456789012345678901来解开文件内容了。
(当然也能够把整个文件头发给KMC,让KMC直接解开xxxxxx,这个详细看设计)。
假设是自己定义文件格式。那么一般都是这么做的。
有几个地方须要注意一下:
1. client和KMCserver的通信最好要採用安全通信,比方ssl,不然那些密钥信息比較easy被人截获到。
2. 对于解密者的身份最好也要认证。不然谁都能够写一个exe来冒充你来和KMC进行通信了,一般使用数字证书就能够了。比方能够对exe进行签名等。
版权声明:本文博主原创文章,博客,未经同意不得转载。
相关文章
- 分布式文件存储FastDFS(七)FastDFS配置文件具体解释
- Kafka-查看分片文件内容(分片日志文件存储格式)
- C# Excel文件导入操作
- php 查找 session 存储文件位置的方法
- Linux Command split 切割文件
- C#【文件操作篇】一种提高C#实时存储excel文件速度的方法
- 阿里云文件存储产品说明
- Mybatis.xml文件中大于小于等于
- git 管理和存储二进制大文件
- Eclipse下无法编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法
- eclipse properties 文件查看和编辑插件
- Python实例 复制文件
- SwiftUI 数据持久化之 数据coredata与文件存储的区别和优势
- numpy的文件存储,读取 .npy .npz 文件
- Vue3之单文件组件(SFC)
- pytorch不像TensorFlow那样有专用的文件存储格式真的是不足吗?pytorch该如何处理大量小文件的读取呢?
- 调用七牛云存储文件,返回url
- input文件上传(上传单个文件/多选文件/文件夹、拖拽上传、分片上传)
- 【Serverless】云存储web上传文件提示网络报错问题
- 【AGC】云存储如何上传文件?是否可以自行开通?云存储的相关问题,来这里看看!
- 使用VIM/VI给文件加密和解密
- Unity 中存储数据到JSON本地文件
- Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)
- JNLP文件的打开方法
- C++中使用 ofstream ifstream 写入读取文件