【问题标题】:Snk file & Delay SigningSnk 文件和延迟签名
【发布时间】:2009-12-23 00:37:45
【问题描述】:

我正在使用一组延迟签名的程序集,我可以在跳过验证后从 GAC 安装和加载它们 (sn -Vr * ...

由于延迟签名作为一个过程只需要公钥文件

  1. sn -k keys.snk(公钥和私钥)
  2. sn -p keys.snk pkey.snk(仅公钥)
  3. 将 pkey.snk 添加到项目属性并选中“仅延迟符号”
  4. sn -v(显示组件是延迟签名的)
  5. sn -e(提取 pkey)
  6. fc(未找到差异)

我发现第一个160 bytes of the SNK file is the PKey... 后面的436个字节代表私钥。

虽然出于开发目的 sn-Vr 或 sn -R keys.snk(用于替换延迟签名的新公钥/私钥对)就足够了,但我很想知道是否从程序集中提取公钥并将其与您自己的私钥配对即可...

这可能是一个潜在的安全漏洞(因为使用公钥令牌查找程序集)...难怪 .Net 框架/SDK 中没有内置工具允许这样做。

是否有记录整个 SNK 文件结构(文件格式)的地方?一般来说,这种方法可以奏效吗?你怎么看?

【问题讨论】:

  • 安全漏洞到底是什么?您的描述不清楚。
  • 我说的是“潜在的”......不是专家......我的头脑:你可以假装别人的公钥是你的......你的公钥令牌会匹配......如果我根据公钥令牌分配了安全权限/跳过了验证,您可能会利用...

标签: .net snk sn.exe


【解决方案1】:

您似乎担心有人会生成一个随机密钥对,将密钥对中的公钥替换为来自不同程序集的公钥,然后签署他们自己的程序集以获得该公钥。

这行不通。
密钥对中的公钥是从私钥以加密方式派生的,并且程序集使用只能使用正确的 private 密钥计算的值进行签名。
每个私钥都会生成不同的签名,并且不可互换。

有关详细信息,请参阅here

【讨论】:

  • @SLaks:感谢您的回复...嗯,这不是一个安全问题:) 或者至少不是故意的...您只需要“公钥”来延迟签名。 ..我无权访问“生产”私钥...为了让我什至加载延迟签名的程序集,我需要跳过验证和其他东西...我只是想知道我是否可以重新使用具有“发布”公钥和我自己自制的私钥的 SNK 文件对程序集进行签名...换句话说,我正在寻找方法来替换具有两个密钥的 SNK 文件中的公钥...
  • @SLaks:当你直接签名时是这样的......因为编译器用你的私钥计算哈希......不是当你延迟签名时......你不需要私钥......还有, sn 可以选择重新计算散列 sn -Ra... 我理解这一点,因为您也可以用新的散列替换程序集中的散列。
  • 正如我所解释的那样,不。你不能像那样混搭关键部分。
  • 如果您询问是否可以使用生产 private 密钥重新签署程序集,可以。
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多