密码基础知识

密码基础知识

2023年7月27日发(作者:)

密码基础知识1、概述 密码只是信息安全的⼀部分,它的⽬的很明确就是为了解决信息安全问题。不同的密码技术算法解决不同的信息安全问题,但没有⼀种技术能解决所有信息安全问题。信息安全有四类特性:1. 机密性:为了防⽌信息被窃听,对应的密码技术有对称密码和⾮对称密码。2. 完整性:为了防⽌信息被篡改,对应的密码技术有单向散列函数、消息认证码、数字签名。3. 认证:为了防⽌攻击者伪装成真正的发送者,对应的密码技术有消息认证码和数字签名。4. 不可否认性:为了防⽌发送者事后否认⾃⼰没有做过,对应的密码技术为数字签名。为了尽可能的解决不同的信息安全特性,我们可能需要组合使⽤多种密码技术。信息安全⾯临的威胁点和所对应的密码技术之间的关系可⽤下图来表⽰:以上主要从类别分类包括6种密码技术:对称密码、⾮对称密码、单向散列函数、消息认证码、数字签名、伪随机数⽣成器。如果看具体的算法,那就包括 AES、RSA、MD5、SHA1、SHA256、HMAC 等。有些⼈还将 BASE64 也理解为⼀种加解密的密码技术,但BASE64 只是⼀种编码⽅式,和 ASCII 和 UTF-8 编码的本质上⼀样,主要⽤途就是将不可打印的⼆进制数据编码为可打印的字符串,因为它不解决信息安全四个特性中的任何⼀种。⼤家都知道⾼性能和⾼安全是很难兼顾,鱼和熊掌不可兼得,我们能做的是尽⼒根据⾃⼰的业务找到平衡点。下⾯分别介绍⼀下这些技术和他们对应的具体算法。2、对称加密 对称加密也称为共享密钥密码、私钥密码,是指⽤相同的密钥加密和解密时的⽅式。对称加密算法的优点是算法公开、计算量⼩、加密速度快、加密效率⾼。缺点是,交易双⽅都使⽤同样钥匙,密钥的分发和管理⽐较困难,安全性得不到保证。 常⽤的对称加密算法有:DES、3DES、AES、Blowfish、RC5、IDEA 等,其中DES已经可以现实中被暴⼒破解,现在的使⽤最⼴泛的对称加密算法是 AES。密码算法可以分为分组密码和流密码两种。其中AES和DES都是属于分组密码。分组密码是将明⽂消息分成⼀定长度的N个分组,然后对每个分组进⾏加密。AES的分组长度是128⽐特,分组密码有很多模式,如果模式选择不恰当,就⽆法充分保证机密性。 AES 是⼀种分组密码,即将明⽂消息拆分为⼀定长度的N个分组,然后对每个分组进⾏加密。AES 的分组长度固定为 128 ⽐特,⽽密钥可以是 128/192/256⽐特。既然是固定长度的分组,那我们要加密任意长度的明⽂,就涉及到如何将多个分组进⾏迭代加密的问题,因此,就有了分组模式。常⽤的分组模式有:ECB、CBC、CFB、OFB、CTR 等。最常⽤的是ECB 和 CBC模式,因此,需要了解下这两种模式的⽤法和区别。 ECB 全称为 Electronic CodeBook,电⼦密码本模式,是最简单的⼀种模式,它直接将明⽂分割成多个分组并逐个加密,如下图: 这种模式的优点就是简单、快速,加密和解密都⽀持并⾏计算。⽽缺点也⽐较明显,因为每个明⽂分组都各⾃独⽴地进⾏加密和解密,如果明⽂中存在多个相同的明⽂分组,则这些分组最终会被转换为相同的密⽂分组。这样⼀来,只要观察⼀下密⽂,就可以知道明⽂中存在怎样的重复组合,并可以以此为线索来破译密码。另外,攻击者可以通过改变密⽂分组的顺序,或删除密⽂分组,或替换掉密⽂分组,就可以达到对明⽂操纵的⽬的,⽽⽆需破译密码。在实际应⽤中,很少需要进⾏并⾏计算的加解密场景,因此,⼀般情况下不会采⽤这种分组模式,⽽更推荐采⽤ CBC 模式。 CBC 全称为 Cipher Block Chaining,密⽂分组链接模式,是将前⼀个密⽂分组与当前明⽂分组的内容混合起来进⾏加密的,如下图: 在 CBC 模式中,⾸先将明⽂分组与前⼀个密⽂分组进⾏ XOR 运算,然后再进⾏加密。加密第⼀个明⽂分组时,由于不存在“前⼀个密⽂分组”,因此需要事先准备⼀个长度为⼀个分组的⽐特序列来代替“前⼀个密⽂分组”,这个⽐特序列称为初始化向量(initializationvector),通常缩写为 IV。CBC 模式避免了 ECB 模式的弱点,明⽂的重复排列不会反映在密⽂中。不过,相⽐ ECB 模式,CBC 模式多了⼀个初始化向量IV。 另外,当最后⼀个明⽂分组的内容⼩于分组长度时,需要⽤⼀些特定的数据进⾏填充,填充⽅式也有很多种,常⽤的有两种:PKCS#5 和 PKCS#7。需要注意的就是,不同编程语⾔使⽤的填充⽅式可能会不同。⽐如,Java 是使⽤ PKCS#5,⽽ iOS 的Objective-C 和 Swift 则采⽤ PKCS#7。不过,对于 AES 来说,两种填充⽅式是⼀样的。  在实际应⽤中,我们⼀般都是在前端对密码或其他敏感数据进⾏加密,然后在后端进⾏解密。因为前后端涉及到不同语⾔的实现,为了保证前后端经过加解密后的结果⼀致,有⼏个参数是需要保持⼀致的:  (1) 密钥:密钥都要使⽤同⼀个,这点基本没有疑问,但需要注意的就是,密钥长度需要统⼀为 128/192/256 ⽐特,即 16/24/32字节。  (2) 分组模式:分组模式推荐统⼀为 CBC 模式,且要显式声明,因为不同语⾔的默认分组模式可能会不同。  (3) 初始化向量:加密和解密时的初始化向量 IV 也是要⼀致的,同样也不要使⽤默认设置,⽽要显式定义。  (4) 填充⽅式:Java 采⽤ PKCS5Padding,iOS 和 JavaScript 采⽤ PKCS7,对于 AES 来说,两者是⼀样的。  还有⼀点也需要注意,AES 算法本⾝操作的都是 byte 字节数组,因此,加密后⼀般会使⽤ BASE64 编码将 byte 数组转为字符串,⽽解密之前则先⽤ BASE64 解码将字符串转回 byte 数组。  使⽤对称加密最关键的就是要保证密钥的安全,⼀般不建议直接在⽹络上传输密钥,另外,在客户端也要做好密钥的安全存储。3、⾮对称加密  ⾮对称加密也称公钥加密,使⽤了⼀对密钥,⽤公钥进⾏加密,再⽤配对的私钥进⾏解密。公钥是公开的,⽽私钥是保密的。相⽐对称加密安全性提⾼了,但牺牲了性能,加解密的速度慢了⼏个数量级,消息越长,加密和解密的速度越慢。  使⽤最⼴泛的⾮对称加密算法就是 RSA,其原理是利⽤了⼤整数质因数分解问题的困难度,加密和解密其实就是⾮常简单的两条公式:  加密:密⽂ = 明⽂^E mod N  解密:明⽂ = 密⽂^D mod N  即是说,加密就是对明⽂的 E 次⽅后除以 N 求余数的过程,其中 E 和 N 的组合就是公钥,即公钥 = (E, N)。⽽解密过程就是对密⽂进⾏ D 次⽅后除以 N 得到余数,即是明⽂,D 和 N 的组合就是私钥,即私钥 = (D, N)。公钥和私钥共有的 N 称为 module,即模数,E 和D 则分别是公钥指数和私钥指数。因为 RSA 是基于以上数学问题的,所以其明⽂、密钥和密⽂都是数字,我们平时看到的字符串其实都是⼆进制表⽰的数字经过 BASE64 编码的。  密钥长度越长越安全,推荐使⽤ 1024 ⽐特或更⼤的值,这⾥说的 1024 密钥长度其实是指模数的长度。还有,不同于对称密码可以加密任意长度的明⽂,RSA 明⽂长度是不能超过密钥长度的。Java 默认的 RSA 加密实现明⽂长度最长为密钥长度减去 11 字节,假如密钥长度设为 1024 ⽐特,即 128 字节,那明⽂长度则不能超过 128 - 11 = 117 字节,如果超过该长度则会抛异常。如果想要加密的明⽂⽐较长,那就⽣成更长的密钥,如 2048 ⽐特,那明⽂可以长达 245 字节,⾜够了。太长的明⽂也不推荐使⽤ RSA 进⾏加密,性能太低了。

  另外,为了提⾼安全性,RSA 加密时都会填充⼀些随机数。RSA 加密填充⽅式主要有三种:NoPadding、PKCS1Padding、OAEPPadding。其中,最常⽤的就是 PKCS1Padding,它会在明⽂前⾯填充 11 字节的随机数,因此,对同⼀明⽂每次加密产⽣的密⽂都会不⼀样。如果想让每次加密产⽣的密⽂都⼀样,那填充⽅式就采⽤ NoPadding,即不填充,但这样⽆疑减低了安全性,所以⼀般不建议采⽤ NoPadding。  实际应⽤中,我们不会直接对长消息进⾏⾮对称加密,⽽只会对⼀些安全性要求⾮常⾼的短消息进⾏加密,⽐如⽤户的密码、对称加密的密钥。SSL/TLS 的加密⽅案就是⽤对称加密对请求消息进⾏加密,⽤公钥加密对对称加密的密钥进⾏加密。想要破解就得通过n算出p和q,但是b⽐较⼤,⼤数的质因分解困难,但是量⼦计算机很有可能破解。4、单向散列函数  对称加密和⾮对称加密主要是⽤来解决消息的机密性问题的,即可以防⽌消息被窃听导致秘密泄露,但却⽆法校验消息是否被篡改。要校验消息是否被篡改,就要对消息进⾏完整性校验,有多种校验⽅案,最简单⾼效的就是单向散列函数。  单向散列函数也称哈希函数、杂凑函数、消息摘要算法等,是能把任意长的输⼊消息串转变成固定长的输出串的⼀种函数,输出值称为“散列值”或“消息摘要”,也称为消息的“指纹”。使⽤单向散列函数,同⼀消息会⽣成同样的散列值,⽽只要改了消息,哪怕只改了1 个字节,最终的散列值变化也很⼤,因此,很适合⽤这个散列值校验消息的完整性。  最常⽤的单向散列函数就是 MD5 和 SHA,SHA 其实包括了 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512,后四种并称为 SHA-2。有时候,我们去下载⼀些软件的安装⽂件时,官⽅⼀般都会提供对应该⽂件的 MD5 和 SHA-1 的散列值,以便我们可以对下载后的⽂件⾃⼰⽣成散列值,再和官⽅提供的散列值进⾏⽐对,就知道这个⽂件有没有被修改过。  在我们平时的实际应⽤中,倒是很少会单独使⽤单向散列函数,⼀般都会结合其他技术⼀起使⽤。毕竟,单独使⽤的安全性不⾼。就举⽤户密码的安全来说吧,很多应⽤会将⽤户密码直接 MD5 之后传输给服务端。这种⽅案主要存在两个安全隐患,⼀是对于⼀些不够复杂的密码难以防范彩虹表,⼆是不同⽤户如果设置了相同密码那散列值⽆疑会⼀样。  先说第⼀点,⾸先,先了解下什么是彩虹表。彩虹表是⼀个⽤于单向散列函数逆运算的预先计算好的表,为了破解密码的散列值⽽准备。我们可以简单理解为彩虹表就是在明⽂和密⽂之间建⽴起对应关系的字典表,可以通过已知的密⽂反查出明⽂,虽然实际上其原理远⽐想象中复杂得多。⽐如说,密码“123456”的 MD5 结果是“E10ADC3949BA59ABBE56E057F20F883E”,那我监听到⽤户登录的请求,拿到“E10ADC3949BA59ABBE56E057F20F883E”这个密码串时,从准备好的彩虹表中就可以反查出原密码是“123456”。  再说第⼆点,设置了相同密码的不同⽤户,由于他们 MD5 后的散列值全都⼀样,那么只要破解了其中⼀个密码,就等于破解了多个⽤户的密码。  为了应对以上两个问题,⽐较好的⽅案就是 MD5 + salt,也称 MD5 加盐,即将原密码拼上⼀串盐值 salt 之后再进⾏ MD5。盐值salt 是⼀个随机字符串,每个⽤户的 salt 值⼀般都是不同的,这样就可以保证不同⽤户最终 MD5 出来的散列值不⼀样,⽽且因为有⼀串随机字符串,彩虹表也很难发挥作⽤了。5、消息认证码  消息认证码是⼀种确认完整性并进⾏认证的技术,英⽂名称为message authentication code,简称为MAC。

  虽然单向散列函数可以⽤来对消息进⾏完整性校验,但⽆法校验消息是否来⾃合法的发送者,即⽆法解决认证问题。要解决发送者的认证问题,最常⽤的有两种⽅案,⼀是采⽤消息认证码,⼆是使⽤数字签名。这⼀⼩节我们先来了解下消息认证码。

  消息认证码的输⼊包括任意长度的消息和⼀个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为 MAC 值。

  消息认证码的实现⽅式有很多种,最常⽤的实现⽅式就是 HMAC,再具体点,根据使⽤哪种单向散列函数可分为:HMAC-MD5、HMAC-SHA1、HMAC-SHA256 等等。HMAC 简单理解就是带有密钥的散列函数,因为有了密钥,就可以对发送者进⾏认证;也因为使⽤了散列函数,也具有完整性校验的性质。

认证的基本流程就是:1. 发送者使⽤共享密钥对消息计算 MAC 值;2. 发送者将消息和 MAC 值⼀起发送给接收者;3. 接收者收到消息和 MAC 值后,使⽤同⼀个共享密钥对消息计算 MAC 值;4. 对⽐计算出来的 MAC 值和接收到的 MAC 值是否⼀致,⼀致则认证成功。  现在,很多接⼝所添加的 URL 签名机制,其实就是对请求做 MAC 认证,具体的设计细节后⾯的⽂章再详细说明。不过,因为使⽤了共享密钥,因此也存在和对称加密⼀样的密钥安全问题6、数字签名  数字签名相当于现实世界中的盖章、签字的功能,使⽤数字签名可以识别篡改和伪装,还可以防⽌否认。

  数字签名可以解决发送者的认证问题,⽽且,数字签名还具有不可抵赖性。数字签名的原理也⾮常简单,其实就是将⾮对称加密反过来⽤。我们知道,⾮对称加密是⽤公钥加密,然后⽤私钥解密。⽽数字签名则是⽤私钥加密,⽣成的密⽂就是数字签名,再⽤公钥解密。⽤私钥进⾏加密这⼀⾏为只能由持有私钥的⼈完成,正是基于这⼀事实,才可以将⽤私钥加密的密⽂作为签名来对待。⽽由于公钥是对外公开的,因此任何⼈都可以⽤公钥进⾏解密,即任何⼈都能够对签名进⾏验证。  另外,我们也知道,⾮对称加密本⾝加密和解密是⾮常慢的,消息越长,性能越慢,因此,⼀般不⽤来加密和解密长消息。同样的,⼀般也不会直接对长消息签名,通常的做法是对消息的散列值进⾏签名,因为散列值⽐较短,所以加密签名相对就会快很多。因此,你会看到数字签名有类似 MD5withRSA、SHA1withRSA 这样的实现。  最后,需要注意⼀点,像 MD5withRSA 和 SHA1withRSA 这样的数字签名实现可以校验消息完整性、对发送者进⾏认证、还可防⽌抵赖,但却不能解决机密性的问题,不要妄想⽤⼀种密码技术就能解决所有问题。  不过,数字签名其实不太适合直接⽤在客户端上。因为客户端要对消息签名,那么客户端就需要保存私钥,那依然有私钥的安全配送和存储问题。数字签名使⽤最⼴泛的应该就是⽤在数字证书上了,这还涉及到 SSL/TLS 和 CA 等,后⾯的⽂章再聊这个话题。7、伪随机数⽣成器  伪随机数⽣成器并不直接解决信息安全问题,但它承担了密钥⽣成的重要职责。⽽密钥的重要性就不⽤多说了。8、总结  密码技术其实⾮常多,还包括各种单⼀技术的组合,我们本篇⽂章所学的只是最基础的⼀些知识,包括了对称加密、⾮对称加密、单向散列函数、消息认证码、数字签名这些密码技术的⼀些必备知识点,只有掌握了这些,才能理解和设计⼀些安全性更⾼的应⽤。

  对称加密和⾮对称加密⽤来解决机密性问题,对称加密的速度快,适合⽤来加密长消息,但密钥在安全配送和客户端的存储是个难点;⽽⾮对称加密避免了共享密钥的安全配送和存储问题,但对长消息的加密速度⾮常慢,只适合⽤来加密短消息。单向散列函数可以⽤来对消息进⾏完整性校验,但很少单独使⽤。消息认证码简单理解就是带密钥的单向散列函数,既能校验完整性,还能对发送者进⾏认证,但因为使⽤了共享密钥,也存在和对称密码⼀样的共享密钥的安全配送和存储问题。数字签名能解决完整性校验、认证和防⽌抵赖等问题,最⼴泛的应⽤是在数字证书上。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690463790a353087.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信