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

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

  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即可!过程如下图:

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即可!过程如下图:

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

    这样做有一个问题,就是关于你预先存好的那个摘要值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拿出了非对称加密算法这把利剑!(再废话一下,非对称加密即生成一对儿钥匙——私钥和公钥,明文被该私钥加密只能用该公钥解密,反之亦然,所以私钥自己要绝对保密,公钥可以给任何人

    将OriHash用私钥加密为CodedHash,并存储在Transfer.dll中。然后在Bank.exe里一次性存入这个为了调用Transfer.dll的公钥,但一定要意识到,Transfer.dll里面是绝对没有私钥的,私钥只包含在myPair.snk文件中,也只有你拿着,并配以荷枪实弹的保安们誓死保护不被别人拿走。

    那么新的验证流程如下,请结合下图:

      a.首先Bank.exe里含有公钥,Transfer.dll里含有CodedHash

      b.Bank.exe用公钥解密CodedHash

      c1.若解密成功,就证明这个CodedHash是用和我公钥配对的那个私钥加密的。

        c11.对Transfer.dll进行摘要得到CurHash,将其和解密的Hash对比,如果一样则证明Transfer.dll是安全的,并且是完整的,加载即可。如果不同,则证明这个Transfer.dll是别人篡改过的,此时拒绝加载Transfer.dll

      c2.若解密失败,则证明这个CodedHash是用别的私钥加密的,也就是黑客弄的,此时同样拒绝加载Transfer.dll

  这样的流程解决了之前的两个问题,即当Transfer.dll正常更新时,不用再把新的Hash传给Bank.exe了,Bank.exe只需用公钥去解密CodedHash便可知晓这东西是谁发的,并通过解密了的Hash和实时计算的Transfer.dll的Hash进行对比。这里我们逻辑上有个假定,那就是Bank.exe里的那个为了调用Transfer.dll的那个公钥是真的。如果你说这个被黑了怎么办,那我只能说,他都能改你这个Bank.exe里的公钥信息了,他就想改什么改什么了,你就束手就缚吧。另外如果你说,我们既然之前说怕传给Bank.exe的OriHash有假,那你为什么不怕传给Bank.exe的公钥有假?我只能说,你的逻辑很清晰,的确,我们无法保证,但我要说的是毕竟公钥只传一次,而OriHash有可能需要多次传输,风险概率不一样,如果我们假定Transfer.dll永不改变,也就是说OriHash也只用传一次,那我可以说你用不用非对称加密算法都是一样的,因为保证第一次给的OriHash是真的和保证第一次给的公钥是真的,这俩的风险系数是一样的。不知道这么说,大家能不能明白我的意思,我也是绕了好久才捋顺的。

    我们可以再假设一遍黑客可能进行的攻击方法:(注意前提是黑客不能动Bank.exe以及内部的PubKey1)

    攻击1:改动并覆盖了我的Transfer.dll,但CodedHash是一模一样的

      这种情况下,对Transfer.dll摘要的Hash和PubKey1对CodedHash解密的结果Hash是不一样的,成功破案!

    攻击2:改动并覆盖了我的Transfer.dll,黑客自己生成了公钥私钥对,并对Transfer.dll的Hash用私钥加密成CodedHash.

      这种情况下,当我们用PubKey1解密CodedHash时,由于公钥PubKey1和黑客的私钥不成对,解密时解不开的,成功破案!

    攻击3:改动并覆盖了我的Transfer.dll,而Transfer.dll根本不是签名编译的。

      这种情况下,结果和前面两个是一样的,成功破案!

    攻击4:黑客兄由于拿不着你的私钥,表示没有其它攻击方案了,T_T。

    至此,原理总算是说明白了。下面我就介绍如何利用sn.exe来办这些事儿了。

    我很讨厌MS把这么多重要的任务都包装在了sn.exe里,首先我们有两个工程Bank.csproj和Transfer.csproj,我们要做的就是实现上图的流程。

      1.用sn.exe生成公钥私钥对文件myPair.snk。如下图:(你要誓死保护好myPair.snk,因为里面有私钥,且这也是私钥唯一存在的地方)

      2.在Transfer工程中,将myPair.snk的路径填到AssemblyInfo.cs文件中,如下图:

        

      3.编译Transfer工程,生成Transfer.dll。此时,编译器瞬间完成了对Transfer.dll的Hash,并用myPair.snk中的私钥加密了Hash成CodedHash,并将CodedHash存入Transfer.dll中,同时公钥信息也存入了Transfer.dll中(注意绝对没有私钥)。

      4.在Bank工程中,重新引用Transfer.dll文件,重新编译Bank.exe,编译时编译器将提取Transfer.dll中的公钥PubKey1,并将其写在引用Dll的描述中。当我们用反编译工具查看Bank.exe时,我们可以查看到如下信息:

          // Transfer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3d5e0147c186af58

       PublicKeyToken即是我们所说的公钥PubKey1。

      5.此时大功告成,无论有人用自己的私钥编译篡改了的Transfer.dll或者根本就没有用私钥签名编译,运行Bank.exe时会抛出如下信息:

这便是最基本的应用了,我也是参考了不少文章,其中比较重要的是http://www.windowsdevcenter.com/pub/a/dotnet/2003/04/28/strongnaming.html,该文章还介绍了延迟签名等机制,有兴趣的朋友可以看看。

  在这里再次说明,sn.exe并不能对程序集加密阻止反编译,只是让调用者知道调用对象是不是想要的,仅此而已。

  另外,HTTPS也是用的类似的方案来判断对方是不是自己人的,只是多了一个用对称加密算法加密数据包这一步,其它和这个都是一样的。

  祝大家在园子里一起进步!

转自:http://www.knowsky.com/604600.html

转载于:https://www.cnblogs.com/Mindy-hym/p/8005273.html

转载:.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法相关推荐

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

    .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法 阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集 ...

  2. sn 强名称工具 (Sn.exe) 创建密钥对生成工具

    sn 强名称工具 (Sn.exe) 创建密钥对生成工具: sn强名称工具(Sn.exe)创建密钥对下载.rar-互联网文档类资源-CSDN下载 使用强命名工具(Strong Name Utility) ...

  3. 程序集注册工具 (Regasm.exe)

    程序集注册工具 (Regasm.exe) 程序集注册工具读取程序集中的元数据,并将所需的项添加到注册表中.注册表允许 COM 客户程序以透明方式创建 .NET Framework 类.类一经注册,任何 ...

  4. 转】.NET强名称工具(Sn.exe)使用详解

    语法格式:ITPUB个人空间 i+F7D2M-Wz;C5esn [-quiet][option [parameter(s)]] 参数及选项说明 -c [csp] r6xc-f4Y"tU'L0 ...

  5. 签名工具 signtool.exe 参数简介

    签名工具是一个命令行工具,用于对文件进行数字签名,以及验证文件和时间戳文件中的签名. 此工具会自动随 Visual Studio 一起安装. 若要运行此工具,请使用 Visual Studio 开发人 ...

  6. 使用sn.exe为程序集签名

    前言 在写上一篇随笔时,为理解EF事务底层的原理,我去Github上把EF的源码下载放到自己项目调试,不过在编译时遇到了下面这个报错信息.经过一番查阅,了解到了程序集签名(也称强名称签名)的概念.报错 ...

  7. 【Android 安全】DEX 加密 ( DEX 加密使用到的相关工具 | dx 工具 | zipalign 对齐工具 | apksigner 签名工具 )

    文章目录 一.dx 工具 二.zipalign 对齐工具 三.apksigner 签名工具 生成多个 DEX 文件 , 需要使用一些工具 , 本博客中简要介绍这些工具 ; 一.dx 工具 dx 工具 ...

  8. 如何在Outlook中查找并运行“收件箱修复工具”(Scanpst.exe)

    您在使用Outlook收发邮件么?知道什么是个人文件夹(.pst)文件么?知道如何使用收件箱修复工具(Scanpst.exe)对.pst文件进行修复么?下面一一为您进行解惑. 背景介绍 ·       ...

  9. office2007的一个邮件修复工具(Scanpst.exe)转载

    邮件收发软件,一直使用的是微软的产品,先是outlook express 后来发现outlook2003功能比express齐全,就一直使用office outlook2003 ,实际使用中发现,ou ...

  10. 一起谈.NET技术,Visual Studio对程序集签名时一个很不好用的地方

    由于我们的项目底层使用到一个通过LogicalCallContext实现的上下文数据管理框架,导致所有的Unit Test不能正常运行.具体的现象在<只在UnitTest和WebHost中的出现 ...

最新文章

  1. c语言做小学生测验程序,[转载]程序设计方法学课程设计--小学生算术四则运算测试程序(C)...
  2. IndexedDB使用(基本函数封到Angular2的service里)
  3. 快速幂实现pow函数(从二分和二进制两种角度理解快速幂)
  4. Oracle收购Sun
  5. python-5 函数
  6. linux上调用短信接口,短信猫接口程序Gnokii For Linux安装
  7. WINDOWS.H already included.MFC apps must not #include windows.h
  8. paip.提升性能---mysql 性能 测试以及 参数调整.txt
  9. 苹果手机专用计算机,使用苹果手机,发现iphone连不上wifi怎么办?连不上wifi解决方法...
  10. RDDs, Spark Memory, and Execution
  11. 腾讯入股艺龙,在线旅游市场引发关注
  12. 招商银行校招笔试通过技巧
  13. 浙江杭州1040阳光工程叫家里人来投资违不违法?能不能赚到钱?
  14. 如何才能修炼成一名不可替代的程序员?
  15. Pytest测试用例之setup与teardown方法(一)
  16. 邮箱服务之阿里云平台
  17. 根据ID或者ID集合查找树形结构数据里面ID所对应的节点信息
  18. 单链表的头插法与尾插法详解
  19. 形容计算机专业的诗句,形容对专业追求的诗句
  20. Linux下USB驱动框架分析

热门文章

  1. python开发本地WEB项目
  2. 重启计算机可以使用什么组合键,win10系统重启电脑的快捷键是什么呢?
  3. 最近项目上遇到的问题~
  4. vb可以开发用c语言,c语言和vb语言的区别是什么?_后端开发
  5. 前端判断文件后缀名_JS - 获取文件后缀,判断文件类型(比如是否为图片格式)...
  6. 美国低速自动驾驶在公共交通应用详解 | 自动驾驶系列
  7. ExcelVBA:请注意!文档部分内容可能包含文档检查器无法删除的个人信息。
  8. HTTP压测工具之wrk
  9. 华为手机隐藏指令的5个代码
  10. 条令考试小程序辅助器_微信小程序条令考试刷分 微信小程序答题刷分软件