【问题标题】:Creating a Strong Name dynamically, without Sn.exe动态创建强名称,无需 Sn.exe
【发布时间】:2012-01-13 20:53:13
【问题描述】:

我正在从事一个旨在简化动态编写程序集的项目,我一直在努力解决的一件事是如何使用强名称对程序集进行签名,而不依赖用于构造强名称的辅助程序(例如 sn.exe)。文档中提到它使用 SHA1 作为哈希算法,但至于如何正确设置强名称,我还无法推断。

我尝试使用随机字节数组的 SHA1 结果创建一个强名称,但是在将 PublicKey 和 PublicKeyToken 设置为它所暗示的内容时(公钥是我创建的字节数组的哈希值,或字节-array 我创建)并将公钥令牌设置为 SHA 哈希的最后八个字节,调用 AssemblyBuilder.Save() 方法时出现错误。

每次我收到一个异常说公钥无效时。有什么我错过的吗?

提前致谢。

【问题讨论】:

标签: c# .net dynamic


【解决方案1】:

您可以尝试使用ICLRStrongName 接口。没有托管 API 可以做同样的事情,因此您必须使用 P/Invoke 从托管程序集中调用它们。我想使用自定义开关从您的程序中调用Strong Name Tool 会容易得多,而不是重新实现它,但是如果您绝对不想使用非托管 API 将是一种方法sn.exe.

【讨论】:

  • 你能解释一下我将如何获得这个接口吗?根据我之前对托管反射 API 的研究,除了自己构建之外,我不确定您从哪里获得 MsCorEE.dll。我是一个从托管世界出生的业余爱好者,所以在我看来,C++ 的结构非常令人讨厌。
  • 附录 没关系,Mscoree.dll 接口通过 Windows Kit 8.0 中的 mscoree.tlb 包含在“Windows Kits\8.0\Lib\win8\um\ x86 目录”。我会检查一下我将如何使用这个界面,并报告结果。
  • 我自己对 API 并不熟悉,但是这篇文章(以及它在第一行中链接的那个)可能会有所帮助,即使它已经很老了 blogs.msdn.com/b/shawnfa/archive/2004/06/18/159711.aspx
  • 谢谢,我现在正在研究并围绕 ICLRStrongName 接口构建一个托管包装器,一旦我有更多信息要告诉我,我会回复结果。
【解决方案2】:

强名称使用 RSA 公钥/私钥对。

您需要将 AssemblyName 上的 KeyPair 属性设置为 StrongNameKeyPair 以生成签名程序集。

这个问题描述了如何构造一个 RSA 密钥对:How to Generate Unique Public and Private Key via RSA

要构造 StrongNameKeyPair,您需要一个描述 RSA 密钥对的 .snk 格式的字节数组。这种格式似乎没有记录,尽管本文对其进行了逆向工程:http://www.developerfusion.com/article/84422/the-key-to-strong-names/

说实话,按照@keyboardP 的建议使用 ICLRStrongName::StrongNameKeyGen 会简单得多,因为它会创建密钥对并以正确的格式放置。即使它确实需要一些 P/invoking。

【讨论】:

  • 这个答案似乎最终是最有效的,使用 RSACryptoServiceProvider 并提取必要的指数、模数、素数等成员,并编写一个表示 StrongNameKeyPair 文件格式的数据块,远远不够比处理 ICLRStrongName 的所有 COM 编组互操作更简单。
【解决方案3】:

公共强名称密钥不是随机字节。它们是 RSA 密钥,这意味着这些字节必须具有某种形式(模数是半素数和指数)。要生成密钥,我会按照keyboardP 的建议并使用ICLRStrongName 接口正确生成公钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多