4 加密服务(Cryptographic Services)
加密服务构成传输过程(安全通信)和数据静止(安全存储)中保护数据的基础。使用复杂的数学运算,他们让你:
- 加密和解密数据,以便它不能被外部观察者理解
- 确认数据没有被修改,因为它最初是由通过哈希(hashing),签名(signing)和验证(verifying)方法发送
本章描述了这些加密技术并简要总结了OS X和iOS提供的技术,帮助您在自己的应用程序中使用加密。
4.1 加密和解密(Encryption and Decryption)
加密是一种保护数据的手段,将数据转换成除了知道如何转化回去的人之外的人拦截后不可读。
加密通常用于在传输过程和存储中保护数据。当信息必须通过一个不可信的通信通道发送,它的责任是两个端点使用加密来保护通信。同样,在本地磁盘的存储信息,应用程序可以使用加密来确保信息对于第三方是不可读即使是电脑被盗了。
有许多不同的加密技术,称为密码(ciphers),以不同的方式工作,能起到不同的作用。密码一般工作结合原始信息(明文cleartext或纯文本plaintext)与第二个信息(关键key)以某种方式生成一个加密的形式,称为密文(ciphertext)。
现代加密技术可以分为三大类:对称加密(symmetric encryption)、非对称加密(asymmetric encryption)和速记式加密(steganography)。
4.1.1对称加密(symmetric encryption)
在对称加密,一个单独的密钥(通常是一个随机字节的长串)用于数学变换信息,然后用于相反的取回原始信息。
对称加密通常用于安全通信。然而,由于两个端点必须知道相同的密钥,对称加密本身是不够的。
4.1.2非对称加密(asymmetric encryption)
在非对称加密,用两个数学相关密钥来转换的信息。使用一个密钥加密的信息只能用另一个密钥来解密,反之亦然。一般来说,其中一个密钥(私钥)是保密的,和其他密钥(公钥)是由广泛可用。出于这个原因,非对称加密也被称为公钥密码学(public key cryptography)。
注意:虽然这两个密钥是数学相关,从一个密钥导出另一个密钥在计算上被认为是不可能的。公钥加密的安全取决于这种情况。
非对称加密通常用于建立一个共享的通信通道。因为非对称加密计算昂贵,两个端点(endpoints)通常使用非对称加密交换对称密钥,然后使用较快的对称加密算法对实际数据加密和解密。
非对称加密也可以用来建立信任。通过你的私钥加密的信息,别人能使用你的公钥读懂这些信息并确认信息是由你加密的。
4.1.3隐写术(steganography)
隐写术意思是隐藏信息在不太重要的另一个信息中。
隐写术通常用于在照片中存储版权信息以大量的不可识别的噪音的形式,除非你知道如何去寻找它。
隐写术也可以用于存储加密卷下面其他加密或不加密卷(通过使用未使用的块或利用以微妙的方式误差修正)。
4.2 哈希散列(Hashing)
散列值,或散列,是一小块的数据来源于一块较大的数据,可以作为一个较大的数据的代理。在密码学中,哈希表用来验证数据的真实性。加密散列算法本质上是一种(非常)有损数据压缩,但是他们专门设计,因此两个相似的数据不太可能散列到相同的值。
例如,两个小学生经常通过来回传递笔记来决定何时一起走路回家。一天,一个恶霸拦截到笔记并且安排鲍勃早十分钟到达,这样他可以偷鲍勃的午餐钱。为了确保他们的信息以后没有被修改,他们设计了一个方案,计算信息中字母的数量除以他们的年龄的总和的余数,然后写了很多点在消息的角落里。通过计算字母的数量他们可以(粗糙)检测到信息是否被修改。
当然,这是一个做作的例子。一个简单的余数是一个很弱的散列算法。好的哈希算法 ,如果你在一块数据上做一些小小的改变,碰撞时不太可能的。这种篡改,抵抗自然的好的散列算法制作一个关键的组件在代码签名,消息签名和其他各种篡改检测方案中。
在高级别上,哈希散列也类似于核对总和(checksumming)(检测和纠正传输数据错误的技术)。然而,这些技术的目标是不同的,所以使用的算法也很不同。校验和通常设计为允许检测和修复一个改变或少量的变化。相比之下,密码散列必须可靠地检测一段数据的大量的更改但不需要告诉你数据如何改变。
例如,以下shell命令中演示了一个通常的散列算法:
$ echo "This is a test. This is only a test." | sha1sum
7679a5fb1320e69f4550c84560fc6ef10ace4550 -
OS X提供了许多C语言 api来执行散列。这些进一步描述本章结束的引用文章中。
4.3 签名和验证(Signing and Verifying)
签名是一种证明消息真实性的方式,或者验证服务器,用户或其他实体的身份。
从前,人们有时用封蜡给信封盖上邮戳。这种印章不仅证明谁发送消息,也证明了在运输途中没有人打开或者修改它。
现代签署通过数学达到许多相同的好处。除了数据本身,签名和验证需要两条信息:适当的一半的公私密钥对和一个数字证书。
消息的发送方计算数据的哈希表然后用私钥加密。收件人也计算哈希表,然后使用相应的公钥解密发送方的哈希表和并进行比较。如果他们是相同的,在传输途中的数据没有修改,您可以安全地相信数据是由密钥的所有者发送的。
发送者的数字证书是数据的集合,其中包含公钥和其他识别信息,在发送者的自由裁量权,例如一个人的名字,公司名称,域名和邮政地址。证书的目的是把一个公钥给一个特定的人。如果你信任的证书,那你也相信由那个人发送的使用发送方的私钥签名的消息。
提供一种确定证书合法性的方式 ,发送方的证书是由其他人签名的,他的证书依次被另外的人签名,等等,形成了一个收件人一直信任的证书的信任链,称为锚证书(anchor certificate)。这个证书可能是根证书--自签名证书代表一个已知的证书颁发机构,因此树的根证书来自权威机构或它可能是用户或应用程序开发人员已经明确指定为信任锚的任意证书,。
因为收件人信任锚证书,收件人知道证书是有效的,因此,发件人是他或她自称的。收件人信任证书的程度由两个因素决定:
- 每个证书都可以包含一个或多个证书扩展(certificate extensions)描述如何使用证书。例如,一个可信的证书签署邮件可能不被信任签署可执行代码。
- 信任策略(trust policy)允许您信任证书,否则是不可信的,反之亦然。
证书还可以用于身份验证。通过签名一个随机数(一个为这个目的特别创建的随机生成的挑战字符串),用户或服务器可以证明他,她,或是它拥有与证书关联的私钥。如果证书是可信(通过评估其信任链),然后证书和签名的随机数证明用户或服务器必须是他,她,或者它声称的。
4.4 安全存储(Secure Storage)
OS X和iOS提供大量的技术安全存储。其中,三个最常用的技术是钥匙串,FileVault和数据保护。
4.4.1 钥匙串(Keychains)
钥匙串类似于物理概念的钥匙串,它是一个存储以后用来执行加密任务的密钥和小块数据的地方,但结局是相似的。物理的钥匙环,主人可以用来挂钥匙,用它来解锁。使用钥匙串,应用程序通常不访问实际的关键数据本身,所以即使被入侵他们没有暴露密钥的风险。相反,他们使用一个惟一的标识符来标识这些密钥,实际的加密算法执行在一个单独的进程中被称为安全服务器(Security Server)。
因此,钥匙串在某种程度上更像是一个携带密匙环的全副武装的守卫。你可以问卫兵为你开启一扇你已经被授权进入的门,但你通常不能自己开门。
OS X还包括一个实用程序,允许用户存储和读取的钥匙串中的数据,称为钥匙串访问(Keychain Access)。这个实用程序之后会有详细描述,在钥匙链访问。
4.4.2 FileVault
OS X中,FileVault使用加密提供加密存储用户的文件。启用FileVault时,磁盘只有授权用户登录后才进行解密。(注意,OS X v10.7之前,FileVault只保护一个用户的主目录)。
4.4.3 数据保护(Data Protection)
iOS提供的api允许应用程序文件只能在设备解锁来保护自己的内容。与数据保护、文件存储在加密和解密后才用户输入他或她的密码。
应用程序在后台运行,也有设置,使文件保持可用,直到用户关闭设备。
附录A:安全服务器和安全代理
OS X和iOS安全实现包含一个守护进程称为安全服务器,实现几个安全协议,如访问密钥链项和根证书信任管理。OS X还包括一个单独的用户代理,称为安全代理,使用安全服务器显示用户界面。
本附录简要描述他们的作用。
安全服务器(Security Server)
安全服务器(securityd)是一个运行在OS X和iOS上的守护进程,实现几个安全协议,如加密、解密和授权计算(在OS X)。
在OS X和iOS,安全服务器监听各种安全api的消息并执行加密服务。因为开发人员通常使用引用密钥而不是用自己的密钥,安全服务器可以保留那些从客户进程中分离出来的地址空间的密钥,从而减少意外的信息泄露的风险。
作为一个额外的优势,只要苹果公司引入了新的身份验证或加密技术,现有的使用OS X安全API的软件可以不用更改代码透明地支持它,提供软件不需要直接导入或导出密钥。
安全服务器没有公共API。相反,你的代码调用API,如钥匙链服务(Keychain Services);证书(Certificate),密钥(Key),信任服务(Trust Services);和授权服务(Authorization Services,只在OS X),依次与安全服务器进行通信。
安全代理(Security Agent)
安全代理是一个单独的进程,提供了用户界面在OS X安全服务器(不在iOS)。它的主要目的是请求身份验证时应用程序请求额外的特权。
安全服务器要求用户进行身份验证时,安全代理显示一个对话框,要求用户名和密码。执行此操作的优势在一个单独的过程是双重的。首先,应用程序可以在没有访问用户的凭证(例如,用户名和密码)时获得授权。第二,它使苹果能够添加新的身份验证的形式,而不需要每一个应用程序来了解它们。
安全代理要求用户为了进行身份验证必须在现场。因为图形用户界面元素不能通过命令行界面例如终端(Terminal)使用或安全shell(ssh)远程会话,这一限制使恶意用户攻击应用程序的安全更加困难。
注意:iOS安全服务接口不提供身份验证。因此,安全服务器没有必要有用户界面,因此,iOS不提供安全代理。