C# 什么是加密数据的好方法,以便由两个独立的方检索数据

C# 什么是加密数据的好方法,以便由两个独立的方检索数据,c#,encryption,C#,Encryption,我搜索了StackOverflow,发现了许多问题,其中人们不推荐双向加密,但我有一个问题需要解决: 我从客户端获取一些与支付无关的敏感信息,这些信息必须保存在SQL Server数据库中 现在一个简单的解决方案是使用盐+散列等加密它 我的问题是,我需要这些敏感的纯文本信息,以便稍后用于行政部门的法律目的(税务、法律等) 此外,当用户需要时,敏感信息应以纯文本形式提供给用户 但它也需要为管理团队解密 我将如何实现上述目标 我的后端使用C# 编辑:更改标题这里是一个使用AES管理的类执行对称加密和

我搜索了StackOverflow,发现了许多问题,其中人们不推荐双向加密,但我有一个问题需要解决:

我从客户端获取一些与支付无关的敏感信息,这些信息必须保存在SQL Server数据库中

现在一个简单的解决方案是使用盐+散列等加密它

我的问题是,我需要这些敏感的纯文本信息,以便稍后用于行政部门的法律目的(税务、法律等)

此外,当用户需要时,敏感信息应以纯文本形式提供给用户

但它也需要为管理团队解密

我将如何实现上述目标

我的后端使用C#

编辑:更改标题

这里是一个使用
AES管理的
类执行对称加密和解密的示例。在数据库中持久化之前执行加密,在授权会话中检索时执行解密

我建议使用经过身份验证的加密(AE或AEAD)模式来确保消息的完整性和身份验证。始终记住对使用相同密钥加密的每条消息使用唯一且不可预测的IV


您可能希望使用两个不同的密钥对敏感数据进行加密—一个密钥用于用户帐户,以便用户在登录时可以看到数据;另一个密钥用于税务/审计人员,保存在密钥托管系统中,以便有一个可审计的跟踪来查看谁在访问数据。两个钥匙都应得到适当保护(即不仅是政策,而且是技术限制,如双钥匙控制或HSMs)

加密吗?最好使用强算法。可逆加密对于密码来说是一个糟糕的想法,但对于其他类型的数据显然是需要的。你到底在问什么;如何使用.NET加密库(如果是这样的话,还有很多例子)?您应该确保使用正确的术语来帮助人们理解和回答您的问题:*加密-以可逆方式保护数据,需要机密信息(即密钥)*散列-以不可逆的方式保护数据,可能需要也可能不需要机密信息*编码-以不需要机密信息的可逆方式将数据转换为不同格式“双向加密”不是标准术语,因为根据定义,加密是可逆的。你已经看到人们推荐的是安全地散列密码,这样他们就不会。。。。。。在发生数据存储泄漏时可恢复。如果以后需要恢复明文数据,则需要使用加密。您将希望使用对称加密,例如AES和CBC/CTR/GCM分组密码操作模式。在C#中,
RijndaelManaged
是您需要使用的类。@Andy IIRC RijandelManaged被弃用,取而代之的是AesManaged。@隐藏在备注部分的LukePark是“Rijndael类是Aes算法的前身。您应该使用Aes算法而不是Rijndael。”
Aes
是一个抽象类,是具体的实现。值得一提的是,C#没有内置的AE模式。有或者OP可以使用一个。@Andy-当你说两个不同的密钥时,这是否意味着我必须存储两个不同的加密版本的数据?是的,如果你强制执行完全隔离。从技术上讲,您可以只使用一个密钥对数据进行加密,然后使用两个不同的主密钥(即一个用于用户,一个用于法律团队)对该“会话密钥”进行加密,但您将无法证明适当的参与者使用了适当的密钥。