我有一些密钥和初始向量,我在 .NET 应用程序中将其用于加密目的。假设它们是:
Key = 0x0102030405060708090A0B0C0D0E
IV = 0xA1A2A3A4A5A6A7A8A9AAABACADAE
在某些情况下,我想在 SQL Server 上(而不是在应用程序中)执行加密,但在应用程序中解密数据。我想我也许能够在数据库中创建一个临时对称密钥并执行加密:
CREATE SYMMETRIC KEY #TempKey
WITH ALGORITHM = AES_128
, IDENTITY_VALUE = ???
, KEY_SOURCE = ???
ENCRYPTION BY PASSWORD = 'Pa$$w0rd';
OPEN SYMMETRIC KEY #TempKey
DECRYPTION BY PASSWORD = 'Pa$$w0rd';
SELECT EncryptByKey(Key_Guid('#TempKey'), 'Secret Data');
CLOSE SYMMETRIC KEY #TempKey;
DROP SYMMETRIC KEY #TempKey;
但我不知道应该提供什么作为 IDENTITY_VALUE 和 KEY_SOURCE 以在数据库和我的应用程序之间拥有“共享”密钥。
更新2014-07-07
我想提供一些我的问题的背景。
首先,我使用 EF Code First 方法,当我需要执行一些数据库更新时,我使用代码优先迁移 http://msdn.microsoft.com/en-us/data/jj591621.aspx我想进一步使用这种纯粹的基于迁移的方法。不幸的是,正如在提问过程中发现的在 EF Code First 迁移中使用自定义逻辑 https://stackoverflow.com/questions/24510143/use-custom-logic-in-ef-code-first-migration,没有办法获取当前的SqlConnection和SqlTransactionUp http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.dbmigration.up%28v=vs.113%29.aspx or Down http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.dbmigration.down%28v=vs.113%29.aspx方法。我唯一的方法 - 使用执行自定义 SQL 查询Sql http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.dbmigration.sql%28v=vs.113%29.aspx method.
在下一次数据库更新中,我想加密一列中的数据。加密应满足两个条件:(1)数据应在客户端应用程序中(而不是在 SQL Server 端)可解密,(2)对称密钥应以加密形式存储在客户端应用程序中,并且描述应为使用密钥容器中的非对称密钥完成。不幸的是,这使得 CRL UDF 在这里毫无用处 - 当我尝试在 UDF 中获取基于密钥容器的密钥时,我收到权限异常:System.Security.SecurityException: Request for the permission of type System.Security.Permissions.KeyContainerPermission
经过我在 1. 和 2 期间所做的所有尝试后,我最终了解到我可以尝试使用以下命令在数据库中创建临时对称密钥CREATE SYMMETRIC KEY
查询,但我所有的尝试都没有成功。
希望这一切将有助于理解问题并找到正确的解决方案。
您的代码和 nelucon 的答案的问题是将 SQL Server 中的 IDENTITY_VALUE 和 .NET 中的初始化向量 (IV) 视为同一事物。他们不是。
初始化向量是一个附加的随机值,它被“泵入”加密函数中,以使密文更难以预测。每次加密任何值时都应该生成它,因此它不是加密密钥的一部分。
IDENTITY_VALUE (from 创建对称密钥 https://learn.microsoft.com/en-us/sql/t-sql/statements/create-symmetric-key-transact-sql?view=sql-server-ver15#remarks docs)
生成一个 GUID,用于标记使用新对称密钥加密的数据。此标记可用于将密钥与加密数据进行匹配。
因此,基本上,IV 是用于随机化密文的标准参数,而 IDENTITY_VALUE 是 SQL Server 特定的密钥标识符。
如果您使用 SQL Server 加密某些纯文本,则生成的密文将包含一些元数据,而不仅仅是加密文本。它的确切结构取决于 SQL Server 版本和使用的加密算法,但它可能包含版本块、使用的加密密钥的 GUID(从 IDENTITY_VALUE 派生)、初始化向量(由 SQL Server 随机生成)和加密文本。您的 .NET 应用程序需要加密文本、加密密钥和 IV,所有这些都作为单独的值提供。
我的建议是坚持使用应用程序或 SQL Server 来管理加密。
如果您确实需要在应用程序中解密在 SQL Server 中解密的内容,我认为您需要找出密文的确切结构并从中检索 IV 和加密文本。
有关 SQL Server 中密文结构的详细信息here https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-cryptography?view=sql-server-ver15#ciphertext-length and here https://techcommunity.microsoft.com/t5/sql-server/sql-server-encryptbykey-cryptographic-message-description/ba-p/383541.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)