基于密钥和初始向量在 SQL Server 中创建对称 AES128 密钥

2024-01-04

我有一些密钥和初始向量,我在 .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

我想提供一些我的问题的背景。

  1. 首先,我使用 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.

  2. 在下一次数据库更新中,我想加密一列中的数据。加密应满足两个条件:(1)数据应在客户端应用程序中(而不是在 SQL Server 端)可解密,(2)对称密钥应以加密形式存储在客户端应用程序中,并且描述应为使用密钥容器中的非对称密钥完成。不幸的是,这使得 CRL UDF 在这里毫无用处 - 当我尝试在 UDF 中获取基于密钥容器的密钥时,我收到权限异常:System.Security.SecurityException: Request for the permission of type System.Security.Permissions.KeyContainerPermission

  3. 经过我在 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(使用前将#替换为@)

基于密钥和初始向量在 SQL Server 中创建对称 AES128 密钥 的相关文章

随机推荐

  • 如何为所有子域设置 Git 配置选项?

    与您可以设置的方式类似特定 URL 的 Git 配置选项 https stackoverflow com a 23807432 1233435 like git config http https code example com sslV
  • 如何禁用 Android Lollipop 波纹的 alpha 值?

    我有一个使用自定义颜色的波纹 然而 颜色永远不会完全不透明 根据来自的回答Ripple 的颜色应该是什么 colorPrimary 或 colorAccent 材料设计 https stackoverflow com questions 2
  • 使用 @Query 在 intellij 中进行语言注入

    使用intellij idea 2016 3 4 是否可以根据参数注入语言 考虑一下这个 Query nativeQuery true value select from Foo List
  • 无法添加文件 iOS 应用程序包

    我添加了一个带有扩展名的空文件 js在资源路径中 但未添加到应用程序的捆绑包中 我确信我已添加到应用程序目标 但有时它包含在捆绑包中 有时它不包含在捆绑包中 我通过以下代码获取文件的内容 NSString filePath NSBundle
  • 测试不同客户端和服务器版本的最佳 Git 策略

    我希望能够为 Java 客户端 服务器运行集成测试 使用嵌入式 jetty 此外 我希望能够在集成测试期间混合搭配不同的服务器和客户端源代码版本 我想知道实现此目的的最佳 git 或 maven 版本策略是什么 客户端和服务器使用相同的 g
  • 如何使用 C# 安全地将数据保存到现有文件?

    如何安全地将数据保存到 C 中已存在的文件中 我有一些数据被序列化到文件中 我很确定直接安全到文件不是一个好主意 因为如果出现任何问题 文件将被损坏 并且以前的版本将丢失 这就是我到目前为止一直在做的事情 string tempFile P
  • webpacker:安装后应用程序中的页面开始加载很长时间

    我正在将 webpacker 安装到我的 Rails 应用程序中 安装后 我注意到应用程序中的页面开始加载很长时间 会发生什么情况 从日志 Completed 200 OK in 90075ms Views 90072 2ms Active
  • 为什么服务器和小型/大型机以及混合核心需要不同的 CPU 架构? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在从数据库获取设置的函数上,我遇到了错误[重复]

    这个问题在这里已经有答案了 我正忙于从数据库获取设置的函数 突然 我遇到了这个错误 Fatal error Call to a member function bind param on boolean in C xampp2 htdocs
  • 如何使用 css 禁用图像的颜色?

    这是一个小问题 如果您访问 www thumbtack com jobs 然后转到他们的赞助商 您可以看到 一开始您看不到赞助商名称中的颜色 但是当您将鼠标悬停在它们上方时 您可以看到颜色出现 有人可以告诉我该怎么做吗 我不太确定在谷歌上搜
  • 有没有工具可以将 CIL 编译为二进制文件?

    看了之前的帖子后 使使用 NET 语言编写的应用程序在旧机器上运行 https stackoverflow com questions 335450 making applications programmed in net languag
  • Firebase 云消息传递是免费的吗?

    我需要在我的应用程序中实现推送通知功能 探索一些选择 谷歌最近推荐了Firebase平台 但这并不是完全免费的服务 于是我又想到了使用GCM 谷歌将来会停止对 GCM 的支持吗 Firebase 云消息传递 https firebase g
  • java gson在序列化时替换密码值

    如何替换密码字段的值XXX使用 Gson 反序列化对象时 我找到了这个帖子 Gson 如何在没有注释的情况下从序列化中排除特定字段 https stackoverflow com questions 4802887 gson how to
  • 无法发送多种类型“|”通过 iOS 访问 Google Places API

    不知何故 我无法通过 iOS 将以下字符串发送到 Google Places API NSString string https maps googleapis com maps api place nearbysearch json lo
  • 如何存储对象数组?

    我有一个对象image我可以做类似的事情image top它会返回一个值 或者我可以这样做image myPoints 0 left它会返回一个值 我基本上有一个为我存储值的图像对象 我希望能够放置多个image数组中的对象 所以我可以做这
  • 无法在 RStudio 中启动 SparkR

    经过漫长而困难的 SparkR 安装过程后 我遇到了启动 SparkR 的新问题 我的设置 R 3 2 0 RStudio 0 98 1103 Rtools 3 3 Spark 1 4 0 Java Version 8 SparkR 1 4
  • 基于 Python 中另外两个数组的值创建数组的子集

    我正在使用Python 如何根据其他两个具有相同长度的向量的值对向量进行子选择 例如这三个向量 c1 np array 1 9 3 5 c2 np array 2 2 3 2 c3 np array 2 3 2 3 c2 2 array T
  • 如何在 Xamarin.Forms 运行时动态添加输入字段

    我正在使用 Xamarin Forms 开发一个项目 我需要在运行时动态创建输入字段 例如 系统会询问用户在一支球队中比赛的球员人数 并根据我需要创建的用户提供的数据Entry每个玩家的姓名 年龄 联系方式等字段 但这如何帮助我动态添加输入
  • Oracle 自连接多个可能的列匹配 - CONNECT BY?

    我有一个来自 的查询需求 尝试解决它CONNECT BY 但似乎无法得到我需要的结果 表 简化 create table CSS USER DESC USER ID VARCHAR2 30 not null NEW USER ID VARC
  • 基于密钥和初始向量在 SQL Server 中创建对称 AES128 密钥

    我有一些密钥和初始向量 我在 NET 应用程序中将其用于加密目的 假设它们是 Key 0x0102030405060708090A0B0C0D0E IV 0xA1A2A3A4A5A6A7A8A9AAABACADAE 在某些情况下 我想在 S