当前位置: 首页 > 知识库问答 >
问题:

在SQL Server或C#中加密数据

邓卓
2023-03-14

我正在研究如何在web服务器上加密选定的用户数据字段,并希望得到关于如何实现最佳结果的建议。举个例子,假设用户输入他/她的名字、姓氏、电子邮件和社会安全号;而且:

  1. 管理员需要能够查看此信息。
  2. 服务器上的进程需要使用该信息

...但万一数据库(或备份)被盗,那么信息就会被加密而无用。

我想,一种html" target="_blank">方法是生成一个私有+公钥,将其存储到Windows证书存储中,将其标记为不可导出(当然保留备份),然后在应用程序层中使用该密钥来根据需要加密/解密字段。

编辑:我决定使用SQL Server2016内置的Always Encrypted。这就是我最终生成主密钥的方式,然后将其安装到本地计算机证书存储中,然后将其设置为SQL Server中的列主密钥(只需SSMS右键单击DB>Security>Always Encrypted Keys>Column master Keys)。

@echo off
echo creating certificate (you might want to set a password on this)...
makecert.exe -n "CN=MyCompany Always Encrypted Master Key 2017" -r -eku 1.3.6.1.5.5.8.2.2,1.3.6.1.4.1.311.10.3.11 -sky exchange -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 -len 2048 -a sha256 -e 01/01/2040 -sv MyCompanyAlwaysEncryptedMasterKey2017.pvk MyCompanyAlwaysEncryptedMasterKey2017.cer

echo merging to pfx (please check to export private key and set a password)...
pvk2pfx -pvk MyCompanyAlwaysEncryptedMasterKey2017.pvk -spc MyCompanyAlwaysEncryptedMasterKey2017.cer

echo done! install your new .pfx into the localmachine certificate store and create a reference to it in sql server!
echo note, backup the .pfx - the certificate private key is marked as non-exportable once installed into the certificate store.
pause

我借用了一些MakeCert.exe参数来提高始终加密证书的有效性

编辑2:经过几天的工作,我们决定不使用Always Encrypted进入生产,因为在SSMS中启用它(和Always Encrypted参数化)后,一些查询会完全挂起,并且我们会看到许多其他问题:例如,每个客户端(ASP.NET、SQL Server作业、计划任务、Reporting Services任务--以及在Always Encrypted列上执行联接或WHERE的每个查询)都需要参数化该查询...即使我们经常这样做--我们有更多的创造性查询(非学校书籍查询),这些查询不可能以这样的方式进行参数化。然后像“%xxx%”等或任何类型的高级TSQL会发生什么,我甚至不想去想。也许我会重新考虑总是加密一个新的解决方案,或者再一次不。不是这里。

共有1个答案

越嘉树
2023-03-14

有两种方法可以实现这一点,

>

  • 使用SQL server中的透明数据加密功能,该功能将加密静止的数据。这意味着数据将由SQL server在磁盘上加密,数据在客户端和SQL server之间的网络上以纯文本可见,数据在SQL server的内存中以纯文本可见。您可以在此处阅读有关此功能的更多信息。

    在SQL server中使用Always Encrypted功能,这是一种客户端加密技术,这意味着它将加密客户端应用程序驱动程序中的数据。这意味着数据将在客户端和SQL server之间的网络上加密,在SQL server的内存中加密,在磁盘上加密。如果正确实现,它还可以保护数据免受在SQL server上获得管理权限的入侵者的攻击(基本上,您必须确保加密密钥不存储在SQL server上,并且入侵者无法以任何方式访问加密密钥)。我在这里详细解释了如何实现这一点以及Always Encrypted提供的安全保证。但是,由于SQL server无法解密数据,因此您可以对加密数据执行哪些操作存在一些限制。有关这些限制的更多信息,请访问https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encryption-database-engine。您可以在这里了解关于始终加密的更多信息。

  •  类似资料:
    • 我用RSA加密来加密C#中的一些数据。现在我想用Java解密加密的数据。但是我遇到了一些问题。 主要问题可能是将加密消息从c#获取到java。在c#中,我们有无符号字节,字节序是不同的 因此,为了进行测试,我将c#中加密数据的数组转换为数组并获得它的字符串表示形式。然后我将字节数组的字符串表示形式复制到我的java代码中并将其转换回“字节”数组。之后,我反转数组以匹配java的endianess。

    • 我正在尝试在我的C#程序中实现RSA加密。 这是我的代码: 我收到这个错误代码: <代码>系统。安全密码学。CryptographicException:“错误数据。” 这一行给出了错误:

    • 问题内容: 我似乎找不到使用AES 128位加密的漂亮示例。 有人有示例代码吗? 问题答案: 如果您只想使用内置的加密提供程序RijndaelManaged,请查看以下帮助文章(它也有一个简单的代码示例): http://msdn.microsoft.com/zh-CN/library/system.security.cryptography.rijndaelmanaged.aspx 以防万一您急

    • 我想把我的C#(托管)解密方法转换成Android NDK, C/C(NO JAVA) 我看到有加密。在JAVA方面,但我想远离任何JNI,我还看到有mcrypt和crypt,但找不到适用于android的编译库。 这里有一个C#的例子,我想把它翻译成C/C 更新到目前为止,我发现最好的方法是使用openSSL AES,我已经下载了一个预编译的Android库,我只是在努力让它与一些已经发布的示例

    • 在C#中解密RSA加密字符串时,我得到的错误是,要解密的数据超过了256字节模的最大值。 我正在努力实现的目标: 在C#(RSA)中生成公钥/私钥对 将私钥保存在会话/临时存储中,以便在解密期间使用 向客户端/JS发送/返回公钥以用于加密 用公钥加密JS中的字符串(最多20个字符)并发送到服务器 使用步骤2中保存的私钥解密服务器中加密的字符串 工作原理: 公钥/私钥对的生成 在JS中使用库jscr

    • 我知道有几个与此相关的问题,但是大多数答案都提供了.NET4.0及以上版本的解决方案。对于我的用途,我必须以.NET3.5为目标。我想简单地加密和解密一个字符串存储在一个文件中,所讨论的文本不是敏感的用户/个人信息。