前言由于客户网络安全限制,连接到互联网的设备不能访问内网 。
需要先从客户端应用中导出数据到文件,再将文件复制到U盘,最后通过内网机器上传数据 。
如何保证,在复制、传输过程中,文件的安全性?
思路首先想到的是对文件进行加密 。但是文件本身可能非常大,因此只能采取对称加密(AES) 。
如果将对称加密的密钥存储在客户端的应用里,可能导致密钥泄露 。
最好是每次加密都使用不同的AES密钥 。
现在的关键是,如何将这个随机AES密钥传输给解密方?
根据我们在《请收藏!这可能是目前最安全的数据加密传输解决方案》中的思路,我们可以采用RSA公钥加密AES密钥,并将其作为文件的一部分发给解密方 。
加密文件将由以下几个部分组成:
- 256字节RSA加密后的AES密钥
- 16字节初始化向量
- AES加密的文件数据
实现理清了思路,让我们来看一下实现 。
首先是加密代码:
(byte[] aesKey, byte[] aesIV) = AesHelper.Create();using (var origFileStream = File.OpenRead("原始文件")){ using (var encryptFileStream = File.Create("加密文件")) { await encryptFileStream.WriteAsync(RSAHelper.Encrypt(aesKey)); await encryptFileStream.WriteAsync(aesIV); using (var cryptoStream = AesHelper.CreateWriteStream(encryptFileStream, aesKey, aesIV)) { await origFileStream.CopyToAsync(cryptoStream); } }}
然后是解密代码:using (var decryptFileStream = File.OpenRead("解密文件")){ using (var encryptFileStream = File.OpenRead("加密文件")) { var aesKeyData = new byte[256]; await encryptFileStream.ReadAsync(aesKeyData, 0, aesKeyData.Length); var aesKey = RSAHelper.Decrypt(aesKeyData); var aesIVData = new byte[16]; await encryptFileStream.ReadAsync(aesIVData, 0, aesIVData.Length); var aesIV = aesIVData; using (var cryptoStream = AesHelper.CreateReadStream(encryptFileStream, aesKey, aesIV)) { await cryptoStream.CopyToAsync(decryptFileStream); } }}
结论通过使用RSA+AES,同时保证了密钥和数据的安全性 。如果你也碰到了类似需求,不妨试试本文的实现方案 。
推荐阅读
- MySQL中如何修改用户各种信息
- C#程序打包步骤
- 运动相机存储卡如何选购?铠侠极至瞬速microSD卡耐用又实惠
- 微信图片过期怎么办?如何查看微信过期图片?3步即可
- React使用百度地图实现驾车路线规划
- 开源转闭源后,法院判定:分支使用“100%开源”是虚假宣传
- 使用golang写一个滑块验证码的库
- 低代码平台开发速度如何?让我们来测评下吧
- Windows 文件审核 – 如何保护服务器上的文件
- 入驻头条30天,我是如何用7条视频把收益做到这种水平的