安全的话题
撰写于:2013年8月26日
作者:silex Wi-Fi专家
这一期是关于安全的话题。说起安全,很多人马上就会联想到“密码”吧。确实,密码是安全的核心组件,但密码不是安全的。在通信的世界里,认证比加密更重要,没有认证的加密甚至被认为是无意义的。为什么会变成这样,这次就来解说一下。
密码和密钥
那么,密码可以比作保险箱。加密和发送和接收信息类似于发送者将机密信息放入保险箱发送,接收方打开保险箱取出。只要在通信路径上没有打开保险箱,就不会发生机密信息的解读、篡改、替换。而且,密码的难以解读=密码强度可以比喻为这个保险箱有多坚固。保险箱会被问到物理强度,但是密码“容易开锁”是表示密码强弱的指标。
例如,保险箱的钥匙如果是十进制的×3位数的拨号盘,所有组合只有1000种。一次3秒,总共3000秒,也就是一个小时内打开。无论多么坚固的保险箱,最重要的钥匙在这样的情况下是不实用的。
作为“安全钥匙”,这里考虑十进制×10位数的拨号锁。这样的话,即使是一次3秒,全部组合的搜索也需要900年以上的时间,所以在实用上首先是安全的。
但在这里我们会遇到另一个问题。到底该如何告诉收件人正确的密钥(拨号盘号码)呢?难道不能和保险箱一起发送“钥匙是1415926535”等信息吗?网络安全中最大的问题就是这个。无论使用多么强大的密码算法,如果不能在收发信者之间建立“安全可靠”交换密钥信息的步骤,就无法实现安全性。
预共享密钥(PSK)方式
那么回到保险箱的话题吧。为了安全、可靠地传递密钥信息,可以考虑事先与本人见面直接传达的方法。或者不是直接传达钥匙的数字,而是像“3年前住的公寓的电话号码”一样,也有从只有当事人知道(可以相信)的信息间接传达的方法。这种方式在通信世界中被称为“预共享密钥(PSK)”。
PSK的最大特点是概念、安装简单。另外,如果能保证“事前直接”设定步骤的安全性,就可以实现与更复杂的其他方式毫不逊色(※注)的安全强度。
(※注)如果事先共享与传输信息相同长度的密钥,只使用一次的话,在理论上是绝对解不开的最强密码。这称为“瓦纳姆密码(Vernam cipher)”。但是瓦纳姆密码有着“只能使用一次(使用两次以上的话统计分析解读的风险会不断上升)”的大缺点,信息只传达一次就可以用于特殊的用途。
PSK方式的缺点是必须“直接”设置密钥。首先是理所当然的,PSK不适合通信设备散布在世界各地而管理作业者不能直接访问的系统(※注)。即使可以直接访问所有设备,例如由100台接入点和3000台节点构成的系统,但设定钥匙非常辛苦。难以想象更改一次设定钥匙的庞大的工作量。
(※注)也许有人认为通过网络设置密钥不就好了,但是网络必须保证安全性。如果是这样的话,也许你会觉得加密不就好了,但是在设定密码密钥之前,如何让加密成立呢?
其结果是PSK系统中设定的密钥有很长时间持续使用的倾向,使用相同的密钥是安全上的弱点。因为与物理保险箱不同,加密的数字数据即使只得到密文,也可以通过统计解析的方法推定密钥信息。特别是在初期无线LAN的密码标准WEP中,由于设定的密钥直接用于加密,对于通过统计解析的密钥推定来说是极其脆弱的系统。WPA(802.11i)停止将PSK密钥直接用于加密,将以PSK密钥为种子生成的随机数(准确地说是伪随机数)作为密钥来提高安全性。
公钥密码和密钥交换
那么,我们来介绍一下公钥密码(Public Key Cryptosystem)。公钥密码是用于加密的密钥和用于解密的密钥不同的特殊密码算法。举例来说,就像保险箱一样,“关闭的钥匙(号码)”和“打开的钥匙(号码)”是分开设置的。
之所以将此称为“公开”密匙,是因为收信人只要秘密地持有“打开的钥匙”,将“关闭的钥匙”发送给发信人,让发信人发出保险箱就可以了。这个“关闭的钥匙”即使被第三者知道也完全没关系。因为即使可以用那个钥匙关闭保险箱(=制作密文),也不能打开保险箱(=解密密文)。与此相对,“打开的密钥”和“关闭的密钥”相同的普通加密方式称为“公用密钥加密(Common Key Cryptosystem)”。
使用公开密匙的密钥交换系统,一般实现如下图的顺序。
像这样用公开密钥加密数据正文并发送/接收的通信系统很少(据我所知是完全没有的),大部分情况下,在实际的数据加密中使用公钥加密,为了交换用于加密的密钥信息而使用公开密钥用的是暗号。这是因为公钥密码的处理所需的运算量庞大,处理非常慢,而且用公钥密码传递给对方的秘密信息也不是以8bit为单位的任意长数据(流),而是采用“满足特定条件的整数”的形态的情况很多,直接加密任意的信息并传递的情况很多。
虽然在开头提到“总不能在保险柜里附上便条”,但是使用公开密匙的密钥交换系统,在“在保险柜里附上便条”发送的基础上还能保证安全性,确实是划时代的创意。由此,首次实现了基于网络的安全密钥交换(无需预先共享密钥)。
使用公开密匙的密匙交换方式的安全性,如果从公开密匙容易推定私有密匙的话就会失败。现在使用最多的公开密匙算法是费马定理中特殊解的RSA方式。对方式已知的解读方法是将数千位长的整数(公开密匙)进行质因数分解,据说这需要庞大的计算量(※)。只要使用足够长的密钥,RSA算法本身的安全强度似乎相当可靠。
(※注)例如,现在实用上几乎安全的RSA密钥长度为2048bit,是10进制600位左右的数字。努力分解质因数需要反复进行√n次除法,需要10^300次的除法。除法所需时间为1纳秒(10^-9),即使以10亿台计算机(10^9)并行计算,10^300/10^18=10^(300-18)=10^282秒,一年约10^7.5秒,所以需要10^274年。虽说是10^274年,但也不能说是1亿年的1亿倍的1亿倍的1亿倍的1亿倍…这是重复30次的数值。“强力的暴力破解”不会破坏RSA密码。2048bit也是这个计算量,所以好像使用了相当于8192bit的RSA密钥的“夏日大作战”的服务器是怎么被暗算破坏的呢(^^)。
中间人的攻击与认证
如前所述,公钥密码是成对的“公钥”和“私钥”,将公钥发送给通信对方,用私钥解密用公钥加密后的数据,交换密钥信息。但是,如果在通信路径上被换成别的公钥和私钥呢?在这种情况下,如下图所示,机密信息会被泄露,加密后交换的数据也会全部被解密。这种攻击方法称为“中间人攻击(Man-In-the-Middle Attack, MIM Attack)”。
为了防止这种情况发生,通信当事人(A,B)之间需要“以某种方式”验证“现在通信的对方真的是A(或B)吗”。而且,在“某种方法”中也有很多使用公钥的情况。这就是“使用数字证书的公钥认证方式”,俗称“PKI认证”。PKI是Public Key Infrastructure的意思,狭义上是证书的格式(X.509标准),广义上是使用公钥的认证系统。
公钥认证(数字证书)
在公钥认证方式中,作为密钥交换时的“身份证明”,使用“由可靠的认证机构(Certificate Agency简称CA)发行的数字证书”。数字证书也是公钥技术的应用,由公钥和私钥的一对组成,但私钥保存在认证机构,只有公钥(如文字所示)公开。
通过向密钥交换通信时生成的私钥和公钥提供“认证机构签名”(使用认证机构私钥加密),接收公钥的一方验证该公钥的合法性(使用认证机构公钥解密)。这样一来,就能识破中间人攻击导致的密钥调换。
“原来如此,使用认证机构可以验证公开密匙的正当性=可以防止中间人的攻击”,我希望大家能够明白这一点。“不过等一下,CA公开密匙的正当性是怎么保证的?”实际上,CA公开密匙也可以使用其他CA签名并进行验证。X.509形式的数字证书就这样连绵不断地连成“证书树”(Certificate Tree或Certificate Chain)。位于树状图最上层的证书不接受任何人的签名,因此被视为应该无条件被信任的“根证书(Root Certificate)”。另外,在少数情况下,由于秘密信息被泄露、解密等原因,证书会失效,为了管理这些信息,会使用“失效证书列表(Certificate Revocation List, CRL)”。
一提到“认证机构”,人们就会联想到社会组织或政府机关,但这只是为了方便而这么读,其主要作用是“发行证书(生成公开密匙)”、“签名(使用秘密密匙加密)”、“发行的证书必须在通信前被安装”。因此,即使是一台计算机或一个程序也可以扮演CA的角色,但真正在社会上具有重要意义的机密(在线交易的证书等)大多是由Verisign公司或RSA Security公司等专业的安全企业发行带签名的证书来使用的。这也有保持私钥安全性的意思,但是这样的安全企业的根证书/CA证书在电脑上经常被预置,所以也有节省安装证书的时间这样的优点。
总结
以上介绍了从通信加密的基础到使用公开密匙的PKI认证。像DES和AES这样的公共密匙并不难,但公开密匙的原理也很难。公共密匙可以类比保险箱转盘,但公共密匙在日常生活中并没有接触过,所以“加密用的密匙和解密用的密匙”这一概念首先直观地体现出来。我觉得很难理解。不从直觉而是从理论开始,那里有费马大定理、离散对数反函数等数学在等着你。
读了本专栏之后,即使觉得“好像懂了”,也不会马上就能读懂TLS的原理,或者明白EAP-TLS和EAP-TTLS的区别。本来原理就很难懂,再加上实用化的安全协议很多都是复杂的规格和实现方式,甚至有人揶揄说“安全中也有难以理解的部分”。
从下期开始,我将讲解“比必要更复杂的规格”的代表——无线LAN中的企业级安全的EAP/IEEE802.1X。
嵌入式无线LAN模块产品介绍页面
密码和密钥
那么,密码可以比作保险箱。加密和发送和接收信息类似于发送者将机密信息放入保险箱发送,接收方打开保险箱取出。只要在通信路径上没有打开保险箱,就不会发生机密信息的解读、篡改、替换。而且,密码的难以解读=密码强度可以比喻为这个保险箱有多坚固。保险箱会被问到物理强度,但是密码“容易开锁”是表示密码强弱的指标。
例如,保险箱的钥匙如果是十进制的×3位数的拨号盘,所有组合只有1000种。一次3秒,总共3000秒,也就是一个小时内打开。无论多么坚固的保险箱,最重要的钥匙在这样的情况下是不实用的。
不安全的保险箱(密钥长度短的密码)
作为“安全钥匙”,这里考虑十进制×10位数的拨号锁。这样的话,即使是一次3秒,全部组合的搜索也需要900年以上的时间,所以在实用上首先是安全的。
实用上被认为是安全的保险箱(密钥长度足够长的密码)
但在这里我们会遇到另一个问题。到底该如何告诉收件人正确的密钥(拨号盘号码)呢?难道不能和保险箱一起发送“钥匙是1415926535”等信息吗?网络安全中最大的问题就是这个。无论使用多么强大的密码算法,如果不能在收发信者之间建立“安全可靠”交换密钥信息的步骤,就无法实现安全性。
预共享密钥(PSK)方式
那么回到保险箱的话题吧。为了安全、可靠地传递密钥信息,可以考虑事先与本人见面直接传达的方法。或者不是直接传达钥匙的数字,而是像“3年前住的公寓的电话号码”一样,也有从只有当事人知道(可以相信)的信息间接传达的方法。这种方式在通信世界中被称为“预共享密钥(PSK)”。
PSK的最大特点是概念、安装简单。另外,如果能保证“事前直接”设定步骤的安全性,就可以实现与更复杂的其他方式毫不逊色(※注)的安全强度。
(※注)如果事先共享与传输信息相同长度的密钥,只使用一次的话,在理论上是绝对解不开的最强密码。这称为“瓦纳姆密码(Vernam cipher)”。但是瓦纳姆密码有着“只能使用一次(使用两次以上的话统计分析解读的风险会不断上升)”的大缺点,信息只传达一次就可以用于特殊的用途。
PSK方式的缺点是必须“直接”设置密钥。首先是理所当然的,PSK不适合通信设备散布在世界各地而管理作业者不能直接访问的系统(※注)。即使可以直接访问所有设备,例如由100台接入点和3000台节点构成的系统,但设定钥匙非常辛苦。难以想象更改一次设定钥匙的庞大的工作量。
(※注)也许有人认为通过网络设置密钥不就好了,但是网络必须保证安全性。如果是这样的话,也许你会觉得加密不就好了,但是在设定密码密钥之前,如何让加密成立呢?
其结果是PSK系统中设定的密钥有很长时间持续使用的倾向,使用相同的密钥是安全上的弱点。因为与物理保险箱不同,加密的数字数据即使只得到密文,也可以通过统计解析的方法推定密钥信息。特别是在初期无线LAN的密码标准WEP中,由于设定的密钥直接用于加密,对于通过统计解析的密钥推定来说是极其脆弱的系统。WPA(802.11i)停止将PSK密钥直接用于加密,将以PSK密钥为种子生成的随机数(准确地说是伪随机数)作为密钥来提高安全性。
公钥密码和密钥交换
那么,我们来介绍一下公钥密码(Public Key Cryptosystem)。公钥密码是用于加密的密钥和用于解密的密钥不同的特殊密码算法。举例来说,就像保险箱一样,“关闭的钥匙(号码)”和“打开的钥匙(号码)”是分开设置的。
例如保险箱的公钥密码
之所以将此称为“公开”密匙,是因为收信人只要秘密地持有“打开的钥匙”,将“关闭的钥匙”发送给发信人,让发信人发出保险箱就可以了。这个“关闭的钥匙”即使被第三者知道也完全没关系。因为即使可以用那个钥匙关闭保险箱(=制作密文),也不能打开保险箱(=解密密文)。与此相对,“打开的密钥”和“关闭的密钥”相同的普通加密方式称为“公用密钥加密(Common Key Cryptosystem)”。
保险箱中的公用密钥密码
使用公开密匙的密钥交换系统,一般实现如下图的顺序。
使用公开密匙的密钥交换系统
像这样用公开密钥加密数据正文并发送/接收的通信系统很少(据我所知是完全没有的),大部分情况下,在实际的数据加密中使用公钥加密,为了交换用于加密的密钥信息而使用公开密钥用的是暗号。这是因为公钥密码的处理所需的运算量庞大,处理非常慢,而且用公钥密码传递给对方的秘密信息也不是以8bit为单位的任意长数据(流),而是采用“满足特定条件的整数”的形态的情况很多,直接加密任意的信息并传递的情况很多。
虽然在开头提到“总不能在保险柜里附上便条”,但是使用公开密匙的密钥交换系统,在“在保险柜里附上便条”发送的基础上还能保证安全性,确实是划时代的创意。由此,首次实现了基于网络的安全密钥交换(无需预先共享密钥)。
使用公开密匙的密匙交换方式的安全性,如果从公开密匙容易推定私有密匙的话就会失败。现在使用最多的公开密匙算法是费马定理中特殊解的RSA方式。对方式已知的解读方法是将数千位长的整数(公开密匙)进行质因数分解,据说这需要庞大的计算量(※)。只要使用足够长的密钥,RSA算法本身的安全强度似乎相当可靠。
(※注)例如,现在实用上几乎安全的RSA密钥长度为2048bit,是10进制600位左右的数字。努力分解质因数需要反复进行√n次除法,需要10^300次的除法。除法所需时间为1纳秒(10^-9),即使以10亿台计算机(10^9)并行计算,10^300/10^18=10^(300-18)=10^282秒,一年约10^7.5秒,所以需要10^274年。虽说是10^274年,但也不能说是1亿年的1亿倍的1亿倍的1亿倍的1亿倍…这是重复30次的数值。“强力的暴力破解”不会破坏RSA密码。2048bit也是这个计算量,所以好像使用了相当于8192bit的RSA密钥的“夏日大作战”的服务器是怎么被暗算破坏的呢(^^)。
中间人的攻击与认证
如前所述,公钥密码是成对的“公钥”和“私钥”,将公钥发送给通信对方,用私钥解密用公钥加密后的数据,交换密钥信息。但是,如果在通信路径上被换成别的公钥和私钥呢?在这种情况下,如下图所示,机密信息会被泄露,加密后交换的数据也会全部被解密。这种攻击方法称为“中间人攻击(Man-In-the-Middle Attack, MIM Attack)”。
对公钥的中间人攻击
为了防止这种情况发生,通信当事人(A,B)之间需要“以某种方式”验证“现在通信的对方真的是A(或B)吗”。而且,在“某种方法”中也有很多使用公钥的情况。这就是“使用数字证书的公钥认证方式”,俗称“PKI认证”。PKI是Public Key Infrastructure的意思,狭义上是证书的格式(X.509标准),广义上是使用公钥的认证系统。
公钥认证(数字证书)
在公钥认证方式中,作为密钥交换时的“身份证明”,使用“由可靠的认证机构(Certificate Agency简称CA)发行的数字证书”。数字证书也是公钥技术的应用,由公钥和私钥的一对组成,但私钥保存在认证机构,只有公钥(如文字所示)公开。
通过向密钥交换通信时生成的私钥和公钥提供“认证机构签名”(使用认证机构私钥加密),接收公钥的一方验证该公钥的合法性(使用认证机构公钥解密)。这样一来,就能识破中间人攻击导致的密钥调换。
使用认证机构签名的公钥交换密钥系统
“原来如此,使用认证机构可以验证公开密匙的正当性=可以防止中间人的攻击”,我希望大家能够明白这一点。“不过等一下,CA公开密匙的正当性是怎么保证的?”实际上,CA公开密匙也可以使用其他CA签名并进行验证。X.509形式的数字证书就这样连绵不断地连成“证书树”(Certificate Tree或Certificate Chain)。位于树状图最上层的证书不接受任何人的签名,因此被视为应该无条件被信任的“根证书(Root Certificate)”。另外,在少数情况下,由于秘密信息被泄露、解密等原因,证书会失效,为了管理这些信息,会使用“失效证书列表(Certificate Revocation List, CRL)”。
一提到“认证机构”,人们就会联想到社会组织或政府机关,但这只是为了方便而这么读,其主要作用是“发行证书(生成公开密匙)”、“签名(使用秘密密匙加密)”、“发行的证书必须在通信前被安装”。因此,即使是一台计算机或一个程序也可以扮演CA的角色,但真正在社会上具有重要意义的机密(在线交易的证书等)大多是由Verisign公司或RSA Security公司等专业的安全企业发行带签名的证书来使用的。这也有保持私钥安全性的意思,但是这样的安全企业的根证书/CA证书在电脑上经常被预置,所以也有节省安装证书的时间这样的优点。
总结
以上介绍了从通信加密的基础到使用公开密匙的PKI认证。像DES和AES这样的公共密匙并不难,但公开密匙的原理也很难。公共密匙可以类比保险箱转盘,但公共密匙在日常生活中并没有接触过,所以“加密用的密匙和解密用的密匙”这一概念首先直观地体现出来。我觉得很难理解。不从直觉而是从理论开始,那里有费马大定理、离散对数反函数等数学在等着你。
读了本专栏之后,即使觉得“好像懂了”,也不会马上就能读懂TLS的原理,或者明白EAP-TLS和EAP-TTLS的区别。本来原理就很难懂,再加上实用化的安全协议很多都是复杂的规格和实现方式,甚至有人揶揄说“安全中也有难以理解的部分”。
从下期开始,我将讲解“比必要更复杂的规格”的代表——无线LAN中的企业级安全的EAP/IEEE802.1X。
嵌入式无线LAN模块产品介绍页面