应用安全系列之二十七:加密算法

24 篇文章 12 订阅
1 篇文章 0 订阅

        为了维持所要保护的信息的机密性和完整性,在一个安全系统里,必须要有加密模块的保护。而且,对于Web应用程序,使用加密算法保护敏感数据已经变成一个很关键的部分,但是,有的Web应用程序经常存在一些不正确的做法,例如:使用一些设计不好的加密算法,使用不合适的加密算法或者不正确地使用一些很强的加密算法,这些都可能导致敏感数据的泄露。

        要保护好数据,就必须正确地使用合适的算法。在对数据加密之前,首先应该知道使用什么加密算法、需要加密哪些数据,以及如何才能正确地使用这些加密算法去保护?

加密算法简介

        不同类型的加密算法有不同的优势和作用,一般都将加密算法分成3类:对称加密算法、非对称加密算法、哈希算法。

        1.对称加密算法

        这是密码学中的一类加密(encryption)算法。该类密码的加密算法是它自己本身的逆反函数,所以其解密算法等同于加密算法,也就是说,要还原对等加密的密文,套用与加密同样的算法的逆运算即可得到明文。

常见的对称加密算法有:DES、3DES、AES、Blowfish、IDEA、RC4、RC5、RC6。DES、RC4、RC5由于其安全性较弱,目前已经很少使用,使用比较多的是3DES和AES。AES和3DES的参数比较如下表:

算 法 名 称算 法 类 型密 钥 长 度速度资 源 消 耗
AES对称block密码128位、192位、256位
3DES对称feistel密码112位或168位

       2.非对称加密算法

        加密和解密使用不同密钥的加密算法,也称为公私钥加密。这两个密钥是数学相关的,用某用户加密密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另一个的秘密性质。公开的密钥称为公钥,不公开的密钥称为私钥。

        非对称加密算法除了可以让用户加密数据以外,还可以进行数字签名。通常使用公钥加密,使用私钥签名。

        常见的非对称加密算法有:RSA、ElGamal、背包算法、Rabin(Rabin的加密法可以说是RSA方法的特例)、Diffie-Hellman(D-H)密钥交换协议中的公钥加密算法、Elliptic Curve Cryptography(ECC,椭圆曲线加密算法)。使用最广泛的是RSA算法(由发明者Rivest、Shmir和Adleman姓氏首字母缩写而来)是著名的非对称加密算法,ElGamal是另一种常用的非对称加密算法。

        目前使用较多的是RSA和ECC椭圆曲线算法,160位ECC算法的安全性相当于1024位的RSA算法,而210位的ECC则相当于2048位的RSA。两者比较如表14-2所示。RSA和ECC参数比较如下表:

算 法 名 称算 法 类 型密 钥 长 度速    资 源 消 耗
RSA大整数分解1024, 2048
ECC有限域上的椭圆曲线离散对数160, 210

  3.哈希算法

        通过单向陷门函数将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值就是哈希值。哈希值是一段数据唯一且极其紧凑的数据表现形式。任何一段明文即使只有一个比特位不同,所产生的哈希值也是不同的。要找到散列值为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以校验数据的完整性。典型的哈希算法以及比较如下表:

算 法 名 称输出大小(bit内 部 大 小区 块 大 小长 度 大 小字 符 尺 寸碰 撞 情 形
HAVAL256/224/192/160/12825610246432
MD2128384128No8大多数
MD41281285126432
MD51281285126432
PANAMA256873625632
RadioGatúnArbitrarily long58 words3 words1-64
RIPEMD1281285126432
RIPEMD-128/256128/256128/2565126432
RIPEMD-160/320160/320160/3205126432
SHA-01601605126432
SHA-11601605126432有缺陷
SHA-256/224256/2242565126432
SHA-512/384512/384512102412864
Tiger(2)-192/160/128192/160/1281925126464
WHIRLPOOL5125125122568

        对于碰撞一列如果是“是”或者“优缺点”的算法,不建议再使用。目前,最流行的是散列值>=224比特的SHA系列算法,有的也称为SHAII算法。新出来的SHAIII(SHA3-224, SHA3-256, SHA3-384, and SHA3-512)也可以参考使用,根据以下图表,可以发现不同的Hash算法的性能比较:

 【FROM:Keccak Team

        MAC(信息认证代码)就是一个散列结果,其中部分输入信息是密钥,只有知道这个密钥的参与者才能再次计算和验证MAC码的合法性。MAC可以简单总结成一句话:有密钥的哈希算法。

        非对称加密算法保密性很强,很难破解,加密Key也很容易分发,但是运行起来很慢,很耗资源;对称加密,运行速度很快,但是安全性没有第一类强,而且加密密钥的分发比较困难;哈希算法,主要是用来检验消息是否被篡改以及用在不可逆的加密方面。各种类型算法使用建议如下表:

算 法 类 型一般的安全情况安全要求较高的情况
对称加密算法大部分的应用128bit的密钥即可168bit或者256bit
非对称加密算法1024比特的RSA已经不建议使用;2048bit
哈希算法128bit哈希结果可满足大部分应用168bit或者256bit

加密算法的作用

        一般使用加密算法主要是为了如下表中的3个目的。

算 法 目 的说    明
保密性防止用户的标识或数据被读取
数据完整性防止数据被更改
身份验证确保数据发自特定的一方

        对于保密性,根据具体的数据的不同,可以使用非对称加密算法和对称加密算法以及哈希算法。例如,保存密码,就建议使用哈希算法。

        对于数据完整性,则必须使用哈希算法。如果要验证消息的完整性,则还必须使用含有密钥的哈希,或者使用非对称加密算法和哈希算法结合,既实现了完整性,又实现了身份验证。

        对于身份验证,可以使用对称加密算法和非对称加密算法。对于非对称加密算法可以通过证书验证对方的身份,而关于对称加密算法,可以通过密钥认证,因为只有拥有密钥的一方加密之后,使用同样的密钥才可以解密(密钥泄露的情况除外)。

        总之,加密算法就是为了阻止没有授权的用户查看在传输中或者存储中的数据,使得数据只对授权的用户(拥有解密密钥者)可见。

加密数据的分类与保护

        在使用加密算法之前,首先需要先对数据进行分类,根据不同的数据的保护要求使用不同的加密算法。

那么,在一个系统的开发之初就应该决定哪些数据需要受到保护。由于一个公司可能有很多系统,不同的系统处理的数据又是不同的,而且不同的行业的要求也不同,医疗系统和银行系统对安全的要求就比一般的商业软件高很多,如何有效地决定哪些数据或者哪些类型的数据需要保护?这就需要在企业级别上出一个指导性的文件(例如:产品安全基线,规定哪些数据需要保护以及如何保护)。这种文档需要公司的高层领导签发批准,由高层推动会比较有效。

具体的哪些信息需要保护?在这里举个例子说明一下。

首先,需要根据信息的保密程度,进行分类,可以分成:一般信息、敏感信息、个人识别信息等,如表14-7所示。每种类型的信息都需要根据类型的需要,决定是否需要保护以及该如何保护?然后,将不同的信息划分到这几种类型下,这样等信息和类型划分好之后,哪些信息该保护、哪些可以不保护、哪些需要特殊的保护等内容就可以一目了然了。下表是一个简单的数据分类示例:

信 息 分 类具 体 信 息
一般身高、爱好、职位、公司等
敏感密码、密钥、内部服务器IP等
个人识别信息身份证号、社会保险号、驾驶证号、护照号、Cookie等
敏感个人识别信息信用卡号、银行卡号等

        这里只是简单举几个例子,根据不同的行业,还有可能有不同的分类方法。

        类别分好之后,就需要根据不同的类别、不同的具体内容进行不同的保护。像一般的信息基本上可以不用保护,甚至一些信息都可以是公开的,如自己的爱好以及自我介绍在交友的网站上都是公开的,可以让别人了解你。敏感的信息则必须是要保护的,否则会影响整个系统的安全,但对于不同的信息可能有不同的保护方法,例如,密码需要用哈希算法,防止可逆性,保密的信息则需要对称加密算法,可以在需要的时候,解密出来原文。个人识别信息需要加密保护,以防止因为系统的漏洞而泄露了个人识别信息。

关于数据保护的常犯错误总结如下:

        (1)明文存储。这类问题主要是由于没有意识到加密数据的重要性,认为数据在系统内部,外部人员根本访问不到;或者数据分类没有做好,没有能够分清哪些数据应该保护、哪些可以不保护,可能导致某些数据没有加密保存,从而以明文存储的形式出现在系统中(这样的做法在某些国家甚至可能会违反法律法规,如PCI-DSS、SOX、HIPPA)。

        (2)已加密但是使用弱加密或者过时的用法。很多算法已经被发现了漏洞,例如:随着硬件速度的提高,DES已经发现有弱点,不推荐再继续使用。那么,使用安全的加密算法是否就没有问题了?答案是:未必。因为安全的加密算法也有可能有不安全的使用方法,AES的CBC模式使用不正确就不能预防Padding Oracle攻击。

        (3)自发明的算法就更不能使用了因为历史证明很难通过隐藏算法的实现来保证算法的安全,自己发明创造的算法对于各种加密攻击的抵抗力很弱,这样的加密算法在课堂上作为教学是很好的例子,但是,在产品环境上,使用需谨慎,特别是一些需要通过关于安全认证的产品,最好还是使用一些标准的加密算法,毕竟这些加密算法是经过专家认证过的,而且也经过了大量实践证明的。

        (4)错误地使用加密根据数据的用途不同,也需要使用不同的方法保护。对于密码来说,使用双向加密算法,就没有使用单向的哈希算法好;若传输非常重要的数据,只是加密是不够的,还需要有完整性的保障措施。

        (5)密钥管理不当,导致密钥容易泄露,或者密钥很难快速更换。密钥管理是最重要的环节,会在下面的👇章节进一步介绍。

密钥的管理

        根据加密数据选择好了加密算法之后,接下来最重要的环节就是密钥的管理了。密钥如果管理不当,使用再安全的加密算法也是徒劳。下面就列出集中不正确的密钥管理方法以及如何解决。

        一、在代码中硬编码密钥

        在代码中直接使用常量字符串作为加密算法的密钥是最简单的一种实现方法,但是,这种方式也是最危险的。因为写在代码中的密钥,由于开发人员的流动性,就导致这个密钥很容易就被泄露。最麻烦的是即使你知道它泄露了,你很难第一时间及时更换密钥。

        二、在配置文件中硬编码密钥

        可能有的人觉得放在配置文件中的密钥总比写在代码里好多了,其实,本质上和写在代码里的密钥也没啥区别,唯一的好处是:更换密钥会相对简单一些【这是在不考虑加密数据兼容的基础上】。如果考虑到加密的数据的兼容,可能与写在代码里没有什么区别。

        三、使用简单有规则的密钥

        在做代码审计时,甚至会遇到密钥是:“1234567890abcdef”这样的密钥,随机性太差太简单的密钥,对于攻击者来说,是最喜欢的密钥类型。就像简单常用的密码一样,在进行破解时,总是会优先尝试这些可能经常被使用的字符串。

         四、没有自动更换机制的密钥

        有些系统在设计时就没有考虑到密钥一旦泄露该怎么处理,在密钥的使用环节:创建、分发、使用、保存和清除的环节中,没有考虑到密钥如何实现自动的轮换机制,导致密钥泄露,也不能第一时间更换使用新的密钥。

        五、所有情况都使用同一个密钥

        有的系统为了管理的简单性,所有的数据都是用同一个密钥加密。这就导致一旦密钥泄露,所有的加密数据都可能会被破解。不同的数据保护级别不一样,那么,在使用加密算法和密钥时,也需要考虑使用不同的加密算法和加密密钥。例如:一个系统个人信息和支付信息的重要性和对系统的影响不一样;一般用户的数据和管理员用户的数据的重要性也不一样;那么,根据分割原则,在保护他们时,也需要考虑使用不同的密钥。

        为了能够正确有效地使用加密算法保护系统内部的数据,需要做到以下几点:

        首先,需要对整个产品的所有信息中进行分类,将需要保护的信息列出来,用于指导设计人员在设计中对这些信息进行保护。不同的信息使用不同类型的加密算法,需要对不同的信息进行说明,如果公司能够有产品安全基线指导如何保护,效果会更好。最好是,公司有一个加密算法的标准,这样开发人员可以根据标准来选择加密算法。

        其次,密钥需要保证一定的随机性,各种语言都提供随机数产生器,需要注意使用安全的随机数产生器。例如:使用Java的java.security.SecureRandom,而不是,java.util.Random。当然,如果有硬件的随机数产生器,就会更安全。

        再者,提供一个统一的密钥管理和更换机制,能够使用HMS系统则更安全。特别是密钥更换时,需要根据密钥的使用情况决定新老密钥如何替换。如果使用密钥加密的数据是一次性的,可以直接替换;如果使用密钥加密的数据被发送到客户端或者其他交互的服务器端,则需要考虑如何保持兼容性;如果使用密钥加密的数据被保存到存储系统,如:数据库或者文件系统;需要考虑之前加密的数据如何处理?等等。

        最后,密钥管理是密码学中最富有挑战的组成部分。开发一个安全高效的加密算法和密钥产生算法是一件很重要的事情,但是,如果没有安全地存储和传送密钥,那么不管算法是多么强大,都是毫无用处的。所以说,保持密钥的机密性是具有挑战性的任务。

  • 关于加密算法的使用最后再总结如下几点:
    1.         选择安全的加密算法;
    2.         使用安全的加密模式和Padding;
    3.         使用随机的而且长度符合安全需求的加密密钥;
    4.         如果加密算法使用初始化xiang'li'na使用随机的初始化向量;
    5.         做好密钥的安全管理;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值