首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态创建强名称,而不使用Sn.exe

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

Stack Overflow用户
提问于 2012-01-13 20:53:13
回答 3查看 1.7K关注 0票数 2

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

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

每次我得到一个异常说公钥无效。这里面有什么我漏掉的吗?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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/调用。

票数 1
EN

Stack Overflow用户

发布于 2012-01-13 21:13:37

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

票数 3
EN

Stack Overflow用户

发布于 2012-01-13 21:37:21

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8857080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档