你的位置:首页 > 软件开发 > ASP.net > .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

发布时间:2015-04-01 00:05:58
阐述签名工具这个概念之前,我先说说它不是什么:  1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有。  2.它很讨厌人们把它和加密联系在一起。我再说说它是什么:  1.起个大名字    sn是strong name的缩写, ...

阐述签名工具这个概念之前,我先说说它不是什么:

  1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有。

  2.它很讨厌人们把它和加密联系在一起。

我再说说它是什么:

  1.起个大名字

    sn是strong name的缩写,正如其名,sn.exe的目的是给程序集起一个唯一的名字(Hash+name+version+culture),即签名,保证不会让两个不同的DLL重名(就跟身份证不能重一样)

  2.让调用者识别被调用的DLL是否被篡改

    这一点是我重点要说的,我们先假设一个场景。一个黑客正在用一个银行客户端程序给一个账户转账,通过反编译发现,前端主程序Bank.exe调用Transfer.dll的TransferMoney方法来进行转账操作。他自然地想到,如果我修改了TransferMoney方法,将金额参数乘以10,然后重新编译成Transfer.dll再覆盖原来的Transfer.dll,他就能成为宇宙首富!

    由这个例子得知,我们亟待解决的安全问题是,让Bank.exe有能力得知其调用的Transfer.dll是不是被别人篡改过的。那么我们很自然地会想到,用信息摘要算法呗~(废话一下,不同内容摘要出来的128位字符串是绝对不一样的

    是的!sn起的这个大名字就是这个摘要信息,我们可以在Bank.exe的引用信息里存好了我应该调用Transfer.dll的摘要值OriHash,这样我们就可以在调用时先摘要一下当前的Transfer.dll得出CurHash,然后比对一下OriHash和CurHash即可!过程如下图:

        .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

    这似乎就是正确答案了,可是...

    这样做有一个问题,就是关于你预先存好的那个摘要值OriHash。有两个方面:

      方面1.一旦我正常地更新了Transfer.dll, 那摘要也就变了,也就是说你要通知Bank.exe去更新OriHash。

      方面2.由问题1引发的安全问题。

    对于方面1,我觉得是最主要的原因,一旦Transfer.dll更新了,为了比对摘要,Bank.exe需要更新OriHash,更新100次Transfer.dll,你就要更新100次OriHash,这个做法太要命了,当然这还只是麻烦层面的问题,更严重的是,我们可以想象到由于频繁更新OriHash而引发的安全问题。

    对于方面2,由于你总去更新OriHash,这个环节一旦被黑客截获,你的OriHash就不一定保证是真的了,当然我个人认为这个怀疑有点过头了,因为DLL引用信息一般都是工具自动添加的,除非你通过某种网络机制传输这个OriHash到Bank.exe所属的项目文件(如Bank.csproj),此时OriHash就有了更多的被黑风险,这是一个安全问题!

原标题:.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

关键词:.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。