是否可以在 SQL Server 2014 中为 .NET 框架程序集创建非对称密钥?

2023-11-25

我正在 Visual Studio 中开发一个 SQL Server 数据库项目,它实际上是一个用户定义函数。在此项目中,我包含 Json.NET 作为参考(使用 NuGet)。

我设法通过首先打开数据库将我的程序集和 UDF 发布(并使其工作)到我的 SQL Server 实例TRUSTWORTHY ON(因为我的项目不安全)然后运行:

CREATE ASSEMBLY [System.Runtime.Serialization] 
FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.Serialization.dll'
WITH PERMISSION_SET = UNSAFE;

结果是 Json.NET 依赖的程序集(如果我不这样做,就会收到错误)

同时我读到过开启“信任”有多糟糕我试着使用非对称密钥避免打开它的方法。

在签署我自己的程序集之前,我知道我必须为System.Runtime.Serialization因为我的项目依赖于 Json.Net,而 Json.Net 又依赖于它,但是当我运行它时,我得到了这个:

USE [master];
GO
  CREATE ASYMMETRIC KEY [SystemRuntimeSerializationKey]
    AUTHORIZATION [dbo]
    FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.Serialization.dll';
GO

Msg 15468, Level 16, State 5, Line 3
An error occurred during the generation of the asymmetric key.

这对我没有多大帮助。

那么是否可以为 .NET 框架程序集生成这样的密钥,或者是否存在除打开 TRUSTWORTHY ON 之外的解决方法?


不,我从来没有找到实现这一目标的方法。用于签署 .NET Framework 程序集的密钥是 Microsoft 内部/私有的。尝试过的选项:

  • 提取私钥/加载到 SQL Server:不可能,否则密钥将不是“私有”的。签名/强命名系统是有效的,因为外部人员不能声称他们签署了代码。

  • 添加签名:我尝试使用添加新签名sn公用事业。不起作用,因为:

    无法重新签署程序集 - 程序集的公钥与签名公钥不匹配。

    但是,即使这确实有效,也可能并不意味着将其加载到 SQL Server 中就可以工作,因为它与您作为资源添加到项目中的程序集不同。其他 .NET Framework DLL(如果有任何其他依赖项)只会知道原始签名。

  • 删除当前签名并添加新签名:我尝试使用ILDASM拆解System.Runtime.Serialization.dll,然后添加从创建的新私钥sn -k然后使用重新链接ILASM,但是失败了ILASM步骤(我没有时间进一步调查)。

    但就像上面的选项一样,即使这确实有效,您也必须更改 Json.NET 项目引用System.Runtime.Serialization要成为这个新的 DLL,请重新编译它,然后将项目引用更改为新的 DLL,然后重新编译它。但这只能让您能够干净地加载 DLL,如果它们具有需要原始 Microsoft 签名的外部依赖项,则不能保证它们能够正常工作。

本质上,如果您正在加载无法控制签名的 DLL,那么唯一的希望就是使用ILDASM并使用重新编译ILASM,指定一个新的snk文件,但如果其他程序集链接到正在重新编译的内容,则该方法将不起作用。当然,.NET Framework DLL 就属于这一类。

简而言之:如果您正在加载不受支持的 .NET Framework DLL,那么您非常需要设置TRUSTWORTHY ON.

BUT:请记住,即使这确实可以通过非对称密钥或证书加载所有内容,但这并不意味着您不会遇到功能问题。这些库尚未获得批准/验证是有原因的。其中的代码可以以您意想不到的方式执行一些操作,例如将数据存储到静态字段。在 Windows 和控制台应用程序中,这不是问题,因为每个应用程序域只能使用一次。但 SQLCLR 使用共享应用程序域,因此多个 SQL Server 会话将共享这些静态变量。可能 Json.NET 库调用的方法没有使用那些不安全的东西,但我们无法知道,即使我们知道,现在我们也无能为力:-(。


我一直在考虑的一件事是跟踪不受支持的 .NET Framework DLL 中调用的方法,并假设它没有执行任何不安全的操作,从而将该代码直接复制到项目中。理论上这应该有效,只要调用System.Runtime.Serialization不要调用其他不受支持的 DLL 或做“不安全”的事情等。但是,我还没有时间对此进行测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 SQL Server 2014 中为 .NET 框架程序集创建非对称密钥? 的相关文章

随机推荐

  • 警告:尝试在其视图不在窗口层次结构中的 ViewController 上呈现 ViewController

    我已经查看了相关问题 但没有解决我的问题 我正在尝试使用dismissViewControllerAnimated animated completion and presentViewControllerAnimated animated
  • 如何在使用 slimerjs 在 casperjs 中运行测试脚本时最大化浏览器窗口

    使用 slimerjs 引擎在 casperjs 中运行测试脚本时 我无法查看完整窗口 谁能帮我增加 mozila 浏览器窗口的大小 当然 在 casper 中使用 phantom slimer viewportSize 选项 casper
  • Java 覆盖特定区域设置的区域设置

    我在用着NumberFormat getCurrencyInstance format amount 将货币从 BigDecimal 格式化为字符串 这按预期工作 问题是我们的主要目标是荷兰市场 而默认的荷兰语格式很奇怪 让我解释一下 当格
  • 在我的标签元素上设置 height: 100% 不起作用

    我尝试设置height 100 在标签中 但它不起作用 为什么不 field label color 3E3E3E font weight bold width 80px display block float left margin to
  • “AnyCPU”平台目标上的内存分配模式

    我故意在一个简单的 C 程序中泄漏内存 以了解有关 NET 如何管理这方面的更多信息 这是使用完成的int 数组 每个数组大小为 1000 万 每 100 毫秒声明一次 数组的元素不会被 触及 如分配一个值 以免将数据带入进程的工作集中 c
  • 服务层和控制器:谁负责什么?

    在课堂上 我们现在正在学习如何构建 Spring 应用程序 即使没有直接涉及 Spring 我们也学习了如何为 DAO 和服务层对象创建接口 如果我错了 请纠正我 DAO 层非常抽象 它只包含 CRUD 操作 并进一步用于读取数据 即 获取
  • Java 转换器错误:无法编译样式表

    我想用 Java 中的 XSLT 转换 XML 为此 我正在使用javax xml transform包裹 但是 我得到了例外javax xml transform TransformerConfigurationException Cou
  • CURLOPT_VERBOSE 不起作用

    Windows 7 x64 PHP 7 2 2 x64 我正在尝试查看一个简单的请求有效负载 因此我为每个创建了一个 PHP 文件https docstore mik ua orelly webprog pcook ch11 07 htm
  • 是否有一种解决方法可以使名称以数字开头的 CSS 类有效? [复制]

    这个问题在这里已经有答案了 是否在名称以数字开头的 CSS 类不起作用的地方引用了它 例如 我发现一个具有如下背景的类 000000 8 background url images common 000000 0 8 png 8FFFFFF
  • 如何从 iframe 内部删除多余的边距?

    我目前正在网站上开发混合媒体的旋转蒙太奇 网站上将轮流显示大约 5 个图像 视频 该网站还使用 Ektron CMS 因此我无法确定蒙太奇中的哪些位置是图像 哪些位置是视频 这些视频托管在 YouTube 上 所以 我的问题是视频加载时与
  • 在 Javascript 中使用 XMLHttpRequest 暂停下载

    我正在尝试使用带有 Javascript 的 XMLHttpRequest 对象的 Web 链接来下载文件 我无法确定是否可以pause下载后resume it 技术上是可以的 无需暂停 恢复 您只需执行响应类型为 blob 的 XmlHt
  • 如何在 Azure Arm 模板中使用粘性暂存槽

    如何使用 ARM 模板将粘性设置部署到 azure Web 应用程序中的生产应用程序槽 而不覆盖现有应用程序设置 我正在使用 Azure ARM 模板来部署我的环境和代码版本 该环境同时具有暂存和生产槽 部署的一部分是部署 AppSetti
  • Angular ui 路由器为所有状态提供多个命名视图

    我想知道是否有任何方法可以为所有状态编写多个命名视图 最好的例子是当我希望导航栏和页脚出现在所有路线中时 stateProvider state home views home templateUrl home html controlle
  • 将图像放置在图像上

    我想将图像放置在捕获的视频帧上我确定的坐标处 我之前问过 我被告知要使用cvCopy and cvSetImageROI但我不想裁剪这些坐标 我想添加另一个图像 也许这是正确的方法 但我不明白 如果正确 请解释 我不久前使用 SetRoi
  • 深度嵌套子查询分解 (CTE) 性能缓慢

    该查询由 16 个相等的步骤组成 每一步都是对同一数据集 单行 进行相同的计算 但最后的步骤需要太多时间 with t0 as select 0 as k from dual t1 as select k from t0 where k g
  • Ubuntu Firefox 的渲染方式有所不同

    与其他浏览器相比 Ubuntu 上的 Firefox 呈现某些 HTML 的方式似乎有很大不同 特别是 Ubuntu 上的一些字体 样式变得越来越大 并且依赖相同数量的换行符来保持对齐的文本列在 Ubuntu Firefox 上不再对齐 我
  • Firefox 在哪里存储 sessionStorage 内容

    我试图找出 Firefox 存储 sessionStorage 内容的位置 但一直找不到 我希望它位于 SqLite 数据库中 就像存储 localStorage 内容一样 但我一直找不到它 到目前为止 我已经搜索了配置文件文件夹中的所有典
  • Laravel Blade - 通过 @include 或 @yield 传递变量

    我需要将变量传递给包含的 Blade 文件 我尝试过两种方式 然而 两者都没有成功 传递一个变量 title 到包含的文件 section left include modal title gt Hello stop Use yield并设
  • 按月分组的聚合 SQL 查询

    我有一个按每小时 每天和每月间隔记录的事务数据库 Access 2007 我想以一种有意义的方式查看它们 而不是按小时计算能源使用情况 这是它的存储方式 我想要 2011 年 1 月的所有使用情况 我想要操作的表具有以下通用格式 CustI
  • 是否可以在 SQL Server 2014 中为 .NET 框架程序集创建非对称密钥?

    我正在 Visual Studio 中开发一个 SQL Server 数据库项目 它实际上是一个用户定义函数 在此项目中 我包含 Json NET 作为参考 使用 NuGet 我设法通过首先打开数据库将我的程序集和 UDF 发布 并使其工作