动态创建强名称,不使用Sn.exe

本文关键字:Sn exe 创建 强名称 动态 | 更新日期: 2023-09-27 18:20:19

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

我曾尝试从随机字节数组中创建一个具有SHA1结果的强名称,但在将PublicKey和PublicKeyToken设置为其含义(公钥是我创建的字节数组或我创建的比特数组的哈希)并将公钥令牌设置为SHA哈希的最后八个字节时,我在调用AssemblyBuilder.Save()方法时出错。

每次我收到一个异常,说公钥无效。这里面有我遗漏的东西吗?

提前谢谢。

动态创建强名称,不使用Sn.exe

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

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

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

这个问题描述了如何构建RSA密钥对:如何通过RSA 生成唯一的公钥和私钥

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

老实说,使用@keyboardP建议的ICLRStrongName::StrongNameKeyGen会简单得多,因为它会创建密钥对并将其设置为正确的格式。即使它确实需要一点P/调用。

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