我有一个像这样的客户表
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
我需要在传入SQL Server之前加密数据并解密相同的数据,以便在.NET开发的应用程序中使用,例如Windows窗体,Asp.Net甚至MVC应用程序。
我需要将带有加密文件的数据传输到我的应用程序以及数据库中。我需要在传输过程中以及在SQL服务器中保存数据时保证数据的安全。
答案 0 :(得分:1)
阿伦,
我知道您希望您的数据在用户使用时被解除类型,但在所有其他点保持加密状态?这与通常用于处理系统内密码的要求相同,除了密码通常是破坏性加密的。
这将为您带来严峻挑战。您将无法使用任何报告工具或汇总数据库查询,因为无论何时使用,您都需要解密受保护的数据,并且解密将是系统中的一个重要安全节点,其实现和访问权限尽可能少。
最终,您的数据需要在使用时进行解密。解密必须基于“用户是谁” - 即必须基于他们通过您的其他身份验证过程获得的权限 - 登录,计算机白名单,DNS,AD等等。这意味着您的所有端点应用程序必须得到适当的保护。这也意味着他们一定不能妥协。因此,您必须使用SSL进行所有通信。您还必须为您的应用程序提供防弹认证机制(只是散列用户密码不够好 - 您需要多层种子和分层散列算法)。因此,除非您知道如何执行所有这些操作,否则请坚持使用Active Directory / Azure AD等操作系统身份验证或基于SAML的某种联合身份验证。
这里的原理是数据从用户输入数据时尽快加密,并且在其对另一个授权用户实际可见之前不会被解密。您不需要关心SQL Server加密等,因为在用户想要查看之前它永远不会被解密 - SQL Server只会看到一个字节列表。
选择您选择的对称或PSK加密算法 - 但绝不试图自己编写一个。使用该算法在用户输入后立即加密,使用从中央服务获得的PSK / SK(Web服务将是最佳方式),但仅限于授权个人(Web服务必须拒绝提供密钥未经授权的个人)加密您的数据并以常规方式存储和处理它。检索它时,将其加密发送到客户端应用程序 - 让客户端应用程序从服务中检索必要的解密密钥,并在使用时解密。
记住最好的crypt / decrypt算法将需要一个“种子”,这通常对于数据库中的每个记录都是不同的,并且可能来自所讨论的记录中的一些其他未加密的值。例如,用于密码加密/哈希的种子可以是用户姓氏的第一个字母的ASCII值,或者是其他静态数据的哈希的一些eosoteric组合(如记录的GUID)。
同样,这可以防止任何批量解密尝试,并使一个解密密钥的猜测非常局限于它所属的单个记录。当然,它会产生副作用,使您的数据在整个应用程序中几乎完全无法读取 - 这是您似乎想要实现的,但可能没有意识到它的影响。