我正在开发一个旨在简化动态编写程序集的项目,我一直试图解决的一个问题是如何使用强名称来签署程序集,没有依赖于用于构造强名称的辅助程序(例如sn.exe)。该文档提到它使用SHA1作为哈希算法,但至于如何正确设置强名称,我还没能推断出。
我尝试使用随机字节数组的SHA1结果创建一个强名称,但是将PublicKey和PublicKeyToken设置为它所暗示的内容(公钥是我创建的字节数组的哈希值,或者是字节-array我创建了)并将公钥标记设置为SHA哈希的最后八个字节,我在调用AssemblyBuilder.Save()方法时遇到错误。
每次我收到异常,说公钥无效。我有什么想念吗?
提前致谢。
答案 0 :(得分:3)
您可以尝试使用ICLRStrongName界面。没有托管API可以执行相同的操作,因此您必须使用P / Invoke从托管程序集中调用它们。我想用你的程序用自定义开关调用Strong Name Tool
而不是重新实现它会更容易,但如果你绝对不想要,那么非托管API将是一种方法。使用sn.exe
。
答案 1 :(得分:1)
公共强名称密钥不是随机字节。它们是RSA密钥,意味着这些字节必须是某种形式(模数是半素数和指数)。要生成密钥,我将遵循keyboardP的建议并使用ICLRStrongName接口正确生成公钥。
答案 2 :(得分:1)
强名称使用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 /调用。