信息安全是近年来的热门话题,特别是最近随着物联网的全民化,安全已经成为移动支付,智能家居等领域发展的核心议题,而安全的本质是算法和安全系统。读完本文,就可以让你成为安全算法领域的专家。 密码安全 1.对称密码(现在最常用的基础密码算法) 对称密码是一种用相同的密钥进行加密和解密的技术,用于确保消息的机密性。 对称密码 对称算法有几大类: DES算法(你的门禁用的就是这个算法哦) DES(Data Encryption Standard)是1977年美国联邦信息处理标准中所采用的一种对称码。 DES是一种将64比特的明文加密成64比特的密文的对称密码算法,它的密钥长度是56比特。尽管从规格上来说,DES的密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实质上其实密钥长度是56比特。由于DES的密文可以在短时间内被破译,因此除了用它来解密以前的密文以外,现在我们不应该运用DES了。 三重DES(3DES) 三重DES是为了增加DES的强度,将DES重复3次所得到的一种密码算法,也称为TDEA,通常缩写为3DES。尽管三重DES现在还被银行等机构运用,但其处理速度不高,除了特别注重向下兼容性的情况以外,很少被用于新的用途。 AES AES(Advanced Encryption Standard)是取代其前任标准(DES)而成为新标准的一种对称密码算法(Rijndael)。Rijndael是由比利时密码学家Joan Daemen和Vincent Rijmen规划的分组密码算法,于2000年被选为新一代的标准密码算法——AES。Rijndael的分组长度和密钥长度可以分别以32比特为单位在128比特到256比特的范围内进行选择。不过在AES的规格中,分组长度固定为128比特,密钥长度只有128、192、和256比特三种。 2. 公钥密码(非对称密码算法,安全度更高的算法,银行卡取钱的时候会用到哦) 公钥密码(非对称密码)中,密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密。公钥算法主要用于身份认证领域。 非对称算法 RSA RSA是一种公钥密码算法,它的名字是由它的三位开发者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母组成的(Rivest-Shamir-Adleman)。RSA的加密是求“E次方的 mod N”,而解密则是求“D次方的 mod N” 密文 = 明文^E mod N明文 = 密文^D mod N 椭圆曲线密码(ECC) 椭圆曲线密码(Elliptic Curve Cryptography,ECC)是最近备受关心的一种公钥密码算法。它的特点是所需的密钥长度比RSA短。椭圆曲线密码是通过将椭圆曲线上的特定点进行特殊的乘法运算来实现的,它利用了这种乘法运算的逆运算非常困难这一特点。运用公钥密码能够搞定密钥配送问题。公钥密码是密码学界的一项革命性发明,现代计算机和互联网所运用的密码技术都得益于公钥密码。 尽管公钥密码能够搞定对称密码中的密钥交换问题,但存在通过中间人攻击被伪装的风险,因此需要对带有数字签名的公钥进行认证。即使已经有了公钥密码,对称密码也不会消失。公钥密码的运行速度远远低于对称密码,因此在一般的通信过程中,往往会配合运用这两种密码,即用对称密码提升处理速度,用公钥密码搞定密钥配送问题。这样的方式称为混合密码系统。 3.单向散列函数(HASH) 单向散列函数有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash code)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。散列值的长度和消息的长度无关。无论消息是1比特,还是100MB,甚至是100GB,单向散列函数都会计算出固定长度的散列值。以SHA-256单向散列函数为例,它所计算出的散列值的长度永远是256比特(32字节)。为了能够确认完整性,消息中哪怕只有1比特的改变,也会产生不一样的散列值。 单向散列函数输出的散列值也称为消息摘要(message digest)或者指纹(fingerprint) HASH MD(Messge Digest)4是由Rivest于1990年规划的单向散列函数,能够产生128比特的散列值。现在它已经不安全了。MD(Messge Digest)5是由Rivest于1991年规划的单向散列函数,能够产生128比特的散列值。MD5的强抗碰撞性已经被攻破。也就是说,现在已经能够产生具备相同散列值的两条不一样的消息,因此它也不安全了。 SHA-1、SHA-256、SHA-384、SHA512 SHA-1是由NIST(美国国家标准技术研究所)规划的一种能够产生160比特的散列值的单向散列函数。现在已不推荐运用。SHA-256、SHA-384、SHA512都是由NIST规划的单向散列函数,它们的散列值长度分别为256比特、384比特、和512比特。这些单向散列函数合起来统称SHA-2。 SHA-1的强抗碰撞性已于2005年被攻破,不过,SHA-2还尚未被攻破。 单向散列函数能够辨别出“篡改”,但无法辨别出“伪装”,这时就需要进行认证。 4. 消息认证码 消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,简称为MAC。 消息认证指的是“消息来自正确的发送者”这一性质。消息认证码的输入包括任意长度的消息和一个发送者与接受者之间共享的密钥,它可以输出固定长度的数据,这个数据成为MAC值。 要计算MAC必须持有共享密钥,没有共享密钥的人就无法计算MAC值,消息认证码正是利用这一性质来完成认证的。此外,和单向散列函数的散列值一样,哪怕消息中发生1比特的变化,MAC值也会产生变化,消息认证码正是利用这一性质来确认完整性的。消息认证码可以说是一种与密钥相关联的单向散列函数。 消息认证码可以运用单向散列函数和对称密码等技术来实现。 MAC与HASH比较 MAC流程 HMAC HMAC是一种运用单向散列函数来构造消息认证码的方式,其中HMAC的H就是Hash的意思。 消息认证码也不能搞定所有的问题,例如“对第三方证明”,和“防止否认”,这两个问题就无法通过消息认证码来搞定。 5. 数字签名 消息认证码之所以无法防止否认,是因为消息认证码需要在发送者和接收者两者之间共享一个密钥。 数字签名是一种能够对第三方进行消息认证,并能够防止通信对象作出否认的认证技术。 数字签名中也同样会运用公钥和私钥组成的密钥对,不过这两个密钥的用法和公钥密码是相反的,即用私钥加密相当于生成签名,而用公钥解密则相当于验证签名。 生成签名和验证签名 实现数字签名运用的算法如下: RSA RSA是一种公钥密码算法,它的名字是由它的三位开发者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母组成的(Rivest-Shamir-Adleman)。 用RSA生成签名和验证签名的过程可用下列公式来表述: 签名 = 消息^D mod N由签名得到的消息 = 密文^E mod N EIGamal EIGamal方式是由Taher EIGamal规划的公钥算法。利用了mod N 下求离散对数的困难度。EIGamal方式可以被用于公钥密码和数字签名。 DSA DSA(Digital Signature Algorithm)是一种数字签名算法,是由NIST于1991年制定的数字签名规范。 DSA是Scnorr算法与EIGammal方式的变体,只能被用于数字签名。 ECDSA ECDSA(Elliptic Curve Digital Signature Algorithm)是一种利用椭圆曲线密码来实现的数字签名算法。 Rabin方式 Rabin方式是由M.O.Rabin规划的公钥算法。利用了在mod N下求平方根的困难度。Rabin方式可以被用于公钥密码和数字签名。 用数字签名既可以识别出篡改和伪装,还可以防止否认,但是无法确认用于验证签名的公钥属于真正的发送者的。 要确认公钥是否合法,可以对公钥施加数字签名,这就是证书。 6.证书 公钥证书(Public-Key Certificate,PKC)其实和驾照很相似,里面记有姓名、组织、邮箱、地址等个人信息,以及属于此人的公钥,并由认证机构(Certification Authority,CA)施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人。公钥证书也简称为证书。认证机构就是能够认定“公钥确实属于此人”并能够生成数字签名的个人或者组织。 消息发送者利用认证机构向消息接收者发送密文 X.509 X.509是一种证书生成和交换的标准规范。 7.PKI(身份认证,银行U盾就是这个体系啦) PKI(Public-Key Infrastructure)是为了能够更有效地运用公钥而制定的一系列规范和规格的总称。X.509也是PKI的一种。 密钥 各种不一样的密钥 1.对称密码的密钥与公钥密码的密钥 2.消息认证码的密钥与数字签名的密钥 3.用于确保机密性的密钥与用于认证的密钥 4.会话密钥与主密钥 当我们访问以 https:// 开头的网页时,Web服务器和浏览器之间会进行基于SSL/TLS的加密通信。在这样的通信中所运用的密钥是仅限于本次通信的一次性密钥,下次通信时就不能运用了。像这样每次通信只能运用一次的密钥称为会话密钥(session key)。 相对于每次通信都更换的会话密钥,一直被重复运用的密钥称为主密钥(master key)。 5.用于加密内容的密钥与用于加密密钥的密钥 一般来说,加密的对象是用户直接运用的消息(内容),这样的情况下所运用的密钥称为CEK(Contents Encrypting Key);相对地,用于加密密钥的密钥则称为KEK(Key Encrypting Key)。 上面提到的会话密钥都是被作为CEK运用的,而主密钥则是被作为KEK运用的。 CEK与KEK CEK与KEK.png Diffe-Hellman密钥交换 Diffe-Hellman密钥交换是1976年由Whitfield Diffe和Martin Hellman共同发明的一种算法。运用这种算法,通信双方通过交换一些可以公开的信息就能够生成出共享的奥秘数字,而这一奥秘数字就可以被用作对称密码的密钥。 Diffee-Hellman密钥交换 8. 随机数(比特币钱包的最爱) 随机数的用处
随机数的性质
真随机数生成器 通过硬件生成的随机数列,是根据传感器收集的热量、声音的变化等事实上无法预测和重现的自然现象信息来生成的。像这样的硬件设备就称为随机数生成器。 伪随机数生成器 而可以生成随机数的软件则称为伪随机数生成器。因为仅靠软件无法生成真随机数,因此要加上一个“伪”字。 9. 国密算法:中国自主的密码算法标准(国家金融安全的核心,要强烈支持) 保证安全最根本的方式是基础软件和基础硬件都是自己控制,现在我国无法短期国产化的情况下,数据加密是最好的方式。如果加密算法以及实现都是外国提供的,安全性从何说起,所以我国国家密码局发布了自主可控的国密算法,包含SM1\ SM2\ SM3\ SM4算法 SM1算法 分组密码算法是分组对称加解密算法,分组长度为128位,密钥长度都为128 比特,算法安全保密强度及相关软硬件实现性能与AES 相当,算法不公开,仅以IP 核的形式存在于芯片中。采用该算法已经研制了系列芯片、智能IC 卡、智能密码钥匙、加密卡、加密机等安全产品,广泛使用于电子政务、电子商务及国民经济的各个使用领域(包括国家政务通、警务通等重要领域)。 SM4分组密码算法 是用于无线局域网和可信计算系统的专用分组密码算法,该算法的分组长度为128比特,密钥长度为128比特。SM4算法是我国制定WAPI标准的组成部分,同时也可以用于其它环境下的数据加密保护。 SM1算法和SM4算法是我国自主规划的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。SM1算法和SM4算法均可以用于网络数据的加密保护,以及储存数据或文件的加密保护。 SM1算法和SM4算法还能够抵抗针对分组密码算法的各种攻击方式,包括穷举搜索攻击、差分攻击、线性攻击等,在实际使用中能够抵抗这些攻击手段。国际上常见的分组密码算法,包括国际上的DES算法、AES算法、IDEA算法等。 SM2算法 由国家密码管理局于2010年12月17日发布,全称为椭圆曲线算法。椭圆曲线并不是椭圆,之所以称为椭圆曲线是因为它们是用三次方程来表示的,并且该方程与计算椭圆周长的方程相似。 摘要算法——国产SM3 摘要函数在密码学中具有重要的地位,被广泛使用在数字签名,消息认证,数据完整性检测等领域。摘要函数通常被认为需要满足三个基本特点:碰撞稳固性,原根稳固性和第二原根稳固性。SM3密码摘要算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。SM3算法适用于商用密码使用中的数字签名和验证,是在SHA-256基础上改进实现的一种算法。SM3算法采用Merkle-Damgard结构,消息分组长度为512位,摘要值长度为256位。 SM3算法的压缩函数与SHA-256的压缩函数具有相似的结构,但是SM3算法的规划更加复杂,比如压缩函数的每一轮都运用2个消息字。 现今为止,SM3算法的安全性相对较高。 当然,算法本身安全了,并不表示就安全了。 在很多流程中,都有可能出现漏洞。举个例子,保险箱虽然很牛逼,但是,保险箱的钥匙如果被偷走,那保险箱就没什么安全性了。 因此,无论算法的数学理论有多牛逼,如果运行算法的过程不是安全的,就容易泄露秘钥。 对算法的攻击,一种常见的手段是SCA(side channel attack)。可以很容易的攻击得到算法的密钥。RSA/AES/DES都可以被攻破。作为follow国际算法的国密算法SM2、SM4,也是一样的道理。 所以,金融领域的产品,都要求必须经过算法的安全认证,在这里,带独立算法引擎的安全硬件就非常重要了。认证过程就是要多算法实现的安全性进行认证。具体的,就是做各种各样的攻击,看是否能得到密钥。同样的,国密局要求,内置了国密算法的安全产品,要想过国密的认证,就必须要做到算法实现的安全性。 物联网那些事 |