为什么要对DLL进行签名
本文链接:
@
曾经在一个项目中,要求您为DLL创建一个强名称,并且为一个项目创建一个强名称,然后编译项目解决方案开始出现奇怪的编译错误。我去过很多次。面对这些问题时,我有些疑问浮出水面。
基础了解
让我们仔细阅读以下基础知识。我们将调查以下内容
-
组装
-
加密
-
散列
-
数字签名
Assembly:
Assembly是用于部署,安全性和版本控制的已编译代码库。EXE和DLL是不同类型的程序集。它由名称,文化,版本和公钥令牌组成。
加密加密是使用算法将信息转换为不可读的过程,并且只能使用称为密钥的特殊信息将不可读的信息转换为可读格式。 它们有两种类型
a) 对称密码学
b) 不对称密码
让我们仅关注非对称密码,因为对称密码是平直的直接密码。
由于使用了一对称为私钥和公钥的密钥,非对称密码技术为加密和解密数据提供了一种非常安全的机制。
**私钥绝不应传递给另一个实体。与公钥相反,它应该被传递。**
私钥由一个实体持有并被安全锁定。永远不要将其传递给另一个实体。公钥是相反的;您可以将公开密钥提供给任何要求它的人。
让我们考虑一个类比,盖茨和史蒂夫希望彼此交流。他们选择非对称方式。盖茨发送带有自动数字挂锁的打开盒子。该数字挂锁可以自动关闭,但需要打开钥匙。
**开箱=公钥 数字挂锁键=私钥**
打开框被认为是每个人都可以意识到的公钥。史蒂夫放置消息并关闭自动打开的数字挂锁框。在这里,用于打开包装盒的钥匙是私钥。
散列:
如果在将数据放入框(甚至框和内容)之后更改了数据,该怎么办。为了避免加密之后或之前的数据更改,我们使用了称为哈希的过程。加密哈希函数将获取任意大小的数据块,并返回固定大小的二进制数据,称为哈希值。如果您以任何方式更改原始数据块,则计算出的哈希值也会更改。如果原始数据中的一位被更改,则至少有50%的计算哈希值的位会更改。如果数据没有更改,并且您反复计算哈希值,则哈希值将相同。如果复制数据并计算其哈希值,它将是相同的。
数字签名:
数字签名可以证明邮件没有被修改,并可以证明其作者的身份。
**非对称加密和哈希的结合**
这是本主题已涵盖的两个主题的必要组合:使用私钥的非对称加密和哈希。通过计算数据哈希值,然后使用专用非对称加密密钥对哈希值进行加密,可以创建数字签名。
Deep Dive已经结束了,让我们回到表面讨论我们真正的目的。
什么是强名?
强名是用于唯一标识装配的技术。它由名称,版本号,文化,公钥令牌和数字签名组成。
强名的意义是什么?
强名解决了两个目的。1. 版本控制 2. 身份验证。
版本控制解决了称为“ DLL Hell”的问题。由于是唯一标识程序集的技术,因此相同的DLL名称可以存在于具有不同版本号的同一文件夹(GAC)中。
身份验证,我们要确保自己成为代码来源的过程。自从我们签署了程序集以来,就解决了这一问题,这解决了身份验证问题。
为什么需要强名?是否所有DLL都需要强名称才能创建?
正如我们所讨论的,强名称解决了版本控制和身份验证的目的,使用强名称签名的共享或公共程序集可以在GAC(全局程序集缓存)中发布。任何使用我们程序集的人都可以确保他们使用的是正确的版本和程序集,而外部版本未对此进行修改。
强名签名仅适用于共享或公开集会
强名签名仅适用于共享或公共大会。如果仅在自己的可执行文件中使用程序集,则无需使用强名称对程序集进行签名。
在实时情况下如何使用强名称
编译器将签名程序集的全名存储到它正在创建的程序集中