我正在从事一个旨在简化动态编写程序集的项目,我一直在努力解决的一件事是,如何使用强名称对程序集进行签名,即,而不依赖于一个辅助程序来构造强名称(如sn.exe)。文档提到它使用SHA1作为哈希算法,但是关于如何正确设置强名称,我还无法推断。
我尝试用随机字节数组的SHA1结果创建一个强名称,但是在将PublicKey和PublicKeyToken设置为它所暗示的(公钥是我创建的字节数组的散列,或者我创建的字节数组的哈希)并将公钥令牌设置为sha散列的最后8个字节时,调用AssemblyBuilder.Save()方法时会出现错误。
每次我得到一个异常说公钥无效。这里面有什么我漏掉的吗?
提前谢谢。
发布于 2012-01-13 21:37:49
强名称使用RSA公钥/私钥对。
需要将AssemblyName上的AssemblyName属性设置为StrongNameKeyPair以生成已签名的程序集。
此问题描述如何构造RSA密钥对:如何通过RSA生成唯一的公钥和私钥。
要构造StrongNameKeyPair,需要一个.snk格式的字节数组来描述RSA对。这种格式似乎没有文档化,尽管本文反向设计了它:http://www.developerfusion.com/article/84422/the-key-to-strong-names/。
老实说,按照@keyboardP的建议,使用ICLRStrongName::StrongNameKeyGen要简单得多,因为它将创建密钥对并将其放入正确的格式。即使它确实需要一点P/调用。
发布于 2012-01-13 21:13:37
您可以尝试使用ICLRStrongName接口。没有托管API来做同样的事情,所以您必须使用P/Invoke从托管程序集中调用它们。我认为使用自定义开关从程序中调用Strong Name Tool要容易得多,而不是重新实现它,但是如果您肯定不想使用sn.exe,那么非托管API将是一种方法。
发布于 2012-01-13 21:37:21
公共强名称键不是随机字节。它们是RSA密钥,意味着这些字节必须是某种形式(半素数和指数的模数)。要生成密钥,我会遵循keyboardP的建议,并使用ICLRStrongName接口正确地生成公钥。
https://stackoverflow.com/questions/8857080
复制相似问题