如何使用 .NET Core 安全地加/解密文件

本文介绍了如何在网络安全受限的环境中,通过RSA公钥加密AES密钥来保证文件在从客户端导出到内网上传过程中安全。加密文件由RSA加密的AES密钥、初始化向量和AES加密的文件数据组成。解密方使用RSA私钥解密AES密钥,再解密文件数据,确保了数据的安全传输。

前言

由于客户网络安全限制,连接到互联网的设备不能访问内网。

需要先从客户端应用中导出数据到文件,再将文件复制到U盘,最后通过内网机器上传数据。

如何保证,在复制、传输过程中,文件的安全性?

思路

首先想到的是对文件进行加密。但是文件本身可能非常大,因此只能采取对称加密(AES)。

如果将对称加密的密钥存储在客户端的应用里,可能导致密钥泄露。

最好是每次加密都使用不同的AES密钥。

现在的关键是,如何将这个随机AES密钥传输给解密方?

根据我们在《请收藏!这可能是目前最安全的数据加密传输解决方案》中的思路,我们可以采用RSA公钥加密AES密钥,并将其作为文件的一部分发给解密方。

加密文件将由以下几个部分组成:

  • 256字节RSA加密后的AES密钥

  • 16字节初始化向量

  • AES加密的文件数据

解密方首先读取并使用RSA私钥解密出AES密钥,再用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,同时保证了密钥和数据的安全性。

如果你也碰到了类似需求,不妨试试本文的实现方案。

想了解更多内容,请关注我的个人公众号”My IO“

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值