Apple - Cryptographic Services Guide

本文翻译自:Cryptographic Services Guide(更新时间:2018-06-04
https://developer.apple.com/library/archive/documentation/Security/Conceptual/cryptoservices/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011172


文章目录

  • 一、关于加密服务
    • 1、概览
      • 加密、签名和验证以及数字证书可以保护数据免遭窥探
      • macOS 和 iOS 提供加密和哈希 API
      • 钥匙串可帮助您存储秘密信息
      • macOS 和 iOS 提供加密安全的随机数生成
      • macOS 和 iOS 提供安全网络通信 API
      • 弃用的技术
    • 2、先决条件
    • 3、也可以看看
  • 二、深入理解密码学概念
    • 1、什么是加密?
    • 2、加密类型
      • 对称密钥
      • 非对称密钥
    • 3、Diffie-Hellman 密钥交换
    • 4、加密哈希函数
    • 5、数字签名
    • 6、数字证书
  • 三、加密和散列数据
    • 1、macOS 和 iOS 常见的加密技术
    • 2、特定于 macOS 的加密技术
  • 四、管理密钥、证书和密码
  • 五、生成随机数
  • 六、安全传输数据
    • 1、使用 URL 加载系统
    • 2、CFNetwork
    • 3、安全传输
    • 4、OpenSSL
    • 5、了解更多
  • 七、CDSA 概述
    • 1、Apple CDSA 插件
      • AppleCSP 模块
      • AppleFileDL 模块
      • AppleCSP/DL 模块
      • AppleX509CL 模块
      • AppleX509TP 模块
    • 2、CSSM 服务
      • 加密服务
      • 数据存储服务
      • 证书服务
      • 信托政策服务
      • 授权计算服务
  • 词汇表


一、关于加密服务

macOS 和 iOS 包含许多提供加密服务的技术 - 加密和解密、哈希、随机数生成、安全网络通信等。
这些技术可用于保护静态数据(存储在硬盘驱动器或其他媒体上时)、传输数据、确定第三方身份以及构建其他安全技术。

在这里插入图片描述


1、概览

iOS 和 macOS 提供的一些加密服务包括:

  • 加密和解密(通用和专用)
  • 使用钥匙串进行密钥管理
  • 加密性强的随机数生成
  • 安全通信(SSL 和 TLS)
  • 使用 FileVault 和 iOS 文件保护进行安全存储

加密、签名和验证以及数字证书可以保护数据免遭窥探

加密主要有两种类型:对称加密(使用单个共享密钥来加密和解密数据)和非对称加密(使用一个密钥来加密数据并使用另一个单独(但相关)的密钥来解密数据)。
可以使用哈希来检测对某段数据的修改。
可以将哈希与非对称密钥组合来创建数字签名,当根据数字证书对该数字签名进行验证时,该数字签名可以证明数据的来源。
反过来,数字证书的验证方式是先验证证书签署方的签名,然后验证该方的证书,依此类推,直到获得您固有信任的证书(称为锚证书)

相关章节: 深入理解密码学概念


macOS 和 iOS 提供加密和哈希 API

macOS 和 iOS 提供了许多用于加密和散列数据的 API,包括钥匙串服务;加密消息语法服务;证书、密钥和信任服务;以及安全转换。

相关章节: 加密和散列数据


钥匙串可帮助您存储秘密信息

如果您的应用存储加密密钥、密码、证书和其他与安全相关的信息,请使用钥匙串。
钥匙串为小块信息提供安全存储,以便系统上运行的其他应用无法访问这些信息,并且只有在用户登录或解锁设备后才可以访问这些信息。
macOS 和 iOS 提供了两个 API 来处理钥匙串和从钥匙串获取的密钥:证书、密钥和信任服务以及钥匙串服务。

相关章节: 管理密钥、证书和密码


macOS 和 iOS 提供加密安全的随机数生成

某些加密任务需要您生成加密性强的伪随机数。
使用随机化服务 API 来生成这些数字。

相关章节: 生成随机数


macOS 和 iOS 提供安全网络通信 API

安全地传输数据需要安全的通信通道。
macOS 和 iOS 提供了许多用于建立安全通信通道的 API,包括 URL 加载系统、Core Foundation 和 Foundation 中的套接字流以及安全传输。

相关章节: 安全传输数据


弃用的技术

尽管 CDSA 和 CSSM API 在 macOS 10.7 及更高版本中已弃用,但其文档仍作为附录提供。

相关章节: CDSA 概述


2、先决条件

在阅读本文档之前,您应该熟悉 安全概述安全编码指南 中的概念。


3、也可以看看

有关 macOS 身份验证和授权(基于加密技术构建)的更多信息,请阅读 身份验证、授权和权限指南

下一个

二、深入理解密码学概念

密码学(源于希腊语kryptos,意为隐藏)一词的核心是指使数据无法被窥探者读取的技术。
但是,密码学也可用于其他目的。
密码学包括一系列技术,可用于验证数据的真实性(检测修改)、确定个人或其他实体的身份、确定谁发送了特定消息或创建了特定数据、安全地通过网络发送数据、使用密码或口令安全地锁定文件等等。

本章介绍了其中的一些技术,从基本加密开始,然后介绍在其基础上构建的其他加密结构。

注意:本章重复了 《安全概述》 中的许多概念,但更加详细和深入。
在阅读本章之前,阅读该文档可能会有所帮助。


1、什么是加密?

加密是将数据转换成一种不使用某些技术就无法理解的形式。
键。
这种转换后的数据被称为密文
使用密钥逆转此过程并将数据恢复为其原始数据(明文(或纯文本)形式称为解密
macOS 和 iOS 中的大多数安全 API 在某种程度上依赖于文本或数据的加密。
例如,加密用于创建证书和数字签名、在钥匙串中安全存储机密以及安全传输信息。

加密可以是任何形式,从用一个字符替换另一个字符的简单过程(在这种情况下,密钥是替换规则)到复杂的数学算法。
出于安全考虑,解密密文越困难越好。
另一方面,如果算法太复杂、耗时太长或需要的密钥太大而无法轻松存储,则在个人计算机中使用起来不切实际。
因此,必须在加密强度和解密速度之间取得某种平衡。
加密性(即某人发现算法和密钥的难度)和易用性。

从实际角度来看,加密只需要足够强大,在数据可能被恶意人士利用的时间内保护数据。
例如,如果您只需要在合同授予后才对合同投标保密,那么几周内就能破解的加密方法就足够了。
如果您要保护您的信用卡号,您可能需要一种多年都无法破解的加密方法。


2、加密类型

计算机安全中使用的加密主要有两种类型,即对称密钥加密非对称密钥加密
与加密密切相关的过程称为密钥加密,即使用密钥和不可逆的数学算法对数据进行转换。
加密散列
本节的其余部分将讨论加密密钥、密钥交换机制(包括某些安全传输协议中使用的 Diffie-Hellman 密钥交换)和加密散列函数。


对称密钥

对称密钥加密(也称为秘密密钥加密)是大多数人都熟悉的密钥的经典用法:使用相同的密钥来加密和解密数据。
最经典且最容易破解的版本是凯撒密码(以尤利乌斯·凯撒命名),其中消息中的每个字母都由字母表中固定位置的字母替换(例如,“a”被“c”替换,“b”被“d”替换,等等)。
在凯撒密码中,用于加密和解密消息的密钥只是字母表旋转的位置数和旋转方向。
现代对称密钥算法更加复杂,更难破解。
但是,它们都使用相同的密钥进行加密和解密。

对称密钥加密有许多不同的算法,可提供从最低限度到几乎牢不可破的安全性。
其中一些算法提供强大的安全性、易于在代码中实现以及快速加密和解密。
这些算法对于加密存储在计算机上的文件以防未经授权的个人使用计算机等目的非常有用。
它们对于从一台计算机向另一台计算机发送消息不太有用,因为通信通道的两端都必须拥有密钥并必须保证其安全。
分发和安全存储此类密钥可能很困难,并且可能会带来安全漏洞。

1968 年,美国海军普韦布洛号一艘美国海军情报船被朝鲜捕获。
当时,每艘海军舰艇都携带了各种密码机的对称密钥,密钥安全级别各不相同。
每个密钥每天都会更换。
由于无法知道有多少密钥没有被普韦布洛号的船员销毁,因此落入朝鲜手中,海军不得不假设普韦布洛号携带的所有密钥都已被泄露。
太平洋战区的每艘舰艇和岸站(即包括海上舰艇在内的数千个设施)都必须通过将密码本和穿孔卡带到每个设施来更换所有密钥。

普韦布洛事件是一个极端案例。
然而,它与通过互联网提供商业安全通信的问题有一些共同之处。
在这两种情况下,代码都用于发送安全消息——不是在两个位置之间,而是在服务器(互联网服务器或海军通信中心)和大量通信者(个人网络用户或船舶和岸站)之间。
参与安全通信的最终用户越多,秘密对称密钥的分发和保护问题就越大。

虽然用于交换或创建对称密钥的安全技术可以在一定程度上克服这个问题(例如,本章后面描述的 Diffie-Hellman 密钥交换),但随着非对称密钥加密实用算法的发明,出现了一种用于计算机通信的更实用的解决方案。


非对称密钥

在非对称密钥加密中,加密和解密消息时使用不同的密钥。
最有用的非对称密钥算法是那些不能从另一个密钥推导出密钥的算法。
在这种情况下,一个密钥可以公开,而另一个密钥则保持安全。
这种安排通常称为公钥加密,并且与对称加密相比具有一些明显的优势:无需向大量用户分发密钥,并且该算法既可用于身份验证,也可用于加密。

第一个被广泛使用的公钥算法是由 Ron Rivest、Adi Shamir 和 Len Adleman 于 1977 年描述的,被称为RSA 加密源自其首字母。
尽管此后还创建了其他公钥算法,但 RSA 仍然是最常用的。
该方法的数学原理超出了本文的范围,可在互联网和许多有关密码学的书籍中找到。
该算法基于两个大素数及其乘积的数学运算。
人们认为它的强度与分解非常大的数字的难度有关。
以现代数字计算机的当前和可预见的速度,在生成 RSA 密钥时选择足够长的素数应该可以使该算法无限期地安全。
然而,这种信念尚未得到数学证明,并且可能存在快速分解算法或完全不同的破解 RSA 加密的方法。
此外,如果开发出实用的量子计算机,分解大数将不再是一个棘手的问题。

其他公钥算法基于与 RSA 复杂度相当的不同数学,包括 ElGamal 加密和椭圆曲线加密。
它们的使用类似于 RSA 加密(尽管其背后的数学不同),本文将不再进一步讨论。

为了了解公钥算法如何解决密钥分发问题,假设 Alice 想要接收来自 Bob 的安全通信。
该过程如图1-1所示。


图1-1 非对称密钥加密

在这里插入图片描述


图 1-1所示的安全消息交换包含以下步骤:

  1. Alice 使用其中一种公钥算法生成一对加密密钥:一个私钥(Alice 保密)和一个公钥。
    他们还准备了一条消息发送给 Bob。
  2. Alice 将未加密的公钥发送给 Bob。
    由于无法从公钥推导出其私钥,因此这样做不会以任何方式泄露其私钥。
  3. 现在,Alice 可以轻松地向 Bob 证明自己的身份(此过程称为身份验证)。
    为此,他们使用私钥加密消息(或消息的任何部分)并将其发送给 Bob。
  4. Bob 使用 Alice 的公钥解密了该消息。
    这证明该消息一定是来自 Alice,因为只有他们拥有用于加密该消息的私钥。
  5. Bob 使用 Alice 的公钥加密他们的消息并将其发送给 Alice。
    该消息是安全的,因为即使被拦截,除了 Alice 之外没有人拥有解密所需的私钥。
  6. Alice 使用他们的私钥解密消息。

由于加密和身份验证是国家安全和保护公司机密的重要主题,一些非常聪明的人既致力于创建安全系统,也试图破解它们。
因此,实际的安全通信和身份验证程序比刚才描述的要复杂得多,这并不奇怪。
例如,使用私钥加密消息的身份验证方法可以通过中间人攻击,即心怀恶意的人(在密码学书籍中通常称为 Eve)截取 Alice 的原始消息并将其替换为自己的,这样 Bob 使用的不是 Alice 的公钥,而是 Eve 的公钥。
然后 Eve 截取 Alice 的每条消息,使用 Alice 的公钥解密,修改它(如果他们愿意),并使用他们自己的私钥重新加密。
当 Bob 收到消息时,他们会使用 Eve 的公钥解密,以为密钥来自 Alice。

虽然这个主题过于宽泛且技术性太强,无法在本文档中详细介绍,但数字证书和数字签名可以帮助解决这些安全问题。
这些技术将在本章后面介绍。


3、Diffie-Hellman 密钥交换

Diffie-Hellman 密钥交换协议是一种让通信会话的两端通过不安全的通道安全地生成共享对称密钥的方法。
Diffie-Hellman 通常使用与 RSA 公钥加密类似的数学来实现。
但是,椭圆曲线加密也可以使用类似的技术。
基本步骤如下:

  1. Alice 和 Bob 交换公钥。
  • 对于 RSA,这些密钥必须具有相同的模部分p
    • 对于椭圆曲线加密,必须就加密所使用的域参数达成一致。
      通常,您应该使用 RFC 5114 中指定的模数或域参数值。
  1. Alice 和 Bob 分别使用他们的私钥加密一个共享的非秘密值g ,然后交换这些加密值。
    g的值通常也取自 RFC 5114,但如果在使用 RSA 时选择了其他值,则g的值必须是原根 mod p - 也就是说,任何与p没有除 1 之外的共同因子的数字都与**g mod p的幂全等。
  2. Alice 使用其私钥加密从 Bob 收到的加密值,反之亦然。
    这些值用作共享会话密钥。

此时,尽管双方都不知道对方的私钥,但双方的会话密钥是相同的。
第三方截获公钥但不知道任何私钥,因此无法生成会话密钥。
因此,使用生成的会话密钥加密的数据在传输过程中是安全的。

尽管 Diffie-Hellman 密钥交换提供了强大的保护措施,防止数据被截获,但它没有提供任何机制来确保连接另一端的实体就是您认为的那个实体。
也就是说,该协议容易受到中间人攻击。
因此,它有时会与其他身份验证方法一起使用,以确保数据的完整性。

Diffie-Hellman 密钥交换支持Apple 文件协议 (AFP) 3.1 版及更高版本以及 Apple 的安全传输 API。
由于 RSA 加密比对称密钥方法慢,因此当必须交换大量加密数据时,Diffie-Hellman(以及使用公钥生成对称私钥的其他系统)非常有用。


4、加密哈希函数

A加密哈希函数可以接收任意数量的数据,并应用一种算法将其转换为固定大小的输出值。
要使加密哈希函数有用,必须非常难以或不可能从哈希值重建原始数据,并且从任何其他输入数据中产生相同输出值的可能性必须极小。

有时,验证数据的完整性比保密更重要。
例如,如果 Alice 向 Bob 发送了一条消息,指示他们销毁一些记录(当然是合法的),那么 Bob 在销毁之前验证文件列表的准确性就很重要。
但是,由于销毁是合法的,因此无需加密消息,这是一个计算成本高且耗时的过程。
相反,Alice 可以计算消息的哈希值(称为消息摘要)并使用他们的私钥加密摘要。
当 Bob 收到消息时,他们会使用 Alice 的公钥解密消息摘要(从而验证该消息来自 Alice),并从消息文本中计算出他们自己的消息摘要。
如果两个摘要匹配,Bob 就知道该消息没有被破坏或篡改。

您将使用的最常见的哈希函数是 SHA-1,这是由美国政府开发和发布的一种算法,它可以从长度不超过 2**64 位的任何数据生成 160 位哈希值。
还有许多更奇特的算法,例如 SHA-2、基于椭圆曲线的算法等。

为了与现有系统和基础设施兼容,您可能偶尔需要使用较旧的算法(例如 MD5),但由于已知的弱点,不建议在新设计中使用它们。


5、数字签名

数字签名是一种使用公钥加密技术确保消息或其他数据完整性的方法。
与用墨水写在纸上的传统签名一样,它们可用于验证数据签名者的身份。
然而,数字签名超越了传统签名,因为它们还可以确保数据本身没有被更改。
这就像签署支票,如果有人更改支票上写的金额,支票正面就会出现“无效”印章。

签名者在创建数字签名之前,必须首先拥有一个数字身份 —— —一个公私密钥对和一个相应的数字证书,以证明签名者公钥的真实性。

签名者生成数据的消息摘要,然后使用私钥加密摘要。
签名者将加密摘要和有关签名者的数字证书的信息与消息一起包含在内。
加密摘要和数字证书的组合就是数字签名。

接收者随后可以使用证书来验证签名;证书包含解密摘要所需的公钥和创建摘要所用的算法。
为了验证签名的文档未被更改,接收者使用相同的算法来创建收到的消息的摘要,然后使用公钥解密消息签名中的加密摘要。
如果两个摘要相同,则消息不可能被更改,并且一定是由公钥的所有者发送的。

为了确保提供签名的人不仅是提供数据的同一个人,而且也是他们所声称的那个人,证书也经过签名 — — 在这种情况下,由颁发证书的认证机构签名。
(稍后将详细介绍认证机构。)

数字签名在代码签名中起着关键作用。
我们鼓励开发人员签署他们的应用。
在执行时,会检查每个应用的签名是否有效。
所有 iOS 应用都需要数字签名。
阅读 代码签名指南 ,了解 macOS 和 iOS 如何使用代码签名的详细信息。

图 1-2说明了创建数字签名。


图 1-2 创建数字签名

在这里插入图片描述


图 1-3说明了验证数字签名的摘要。
接收者从签名者的证书中获取签名者的公钥,并使用该公钥解密摘要。
然后,使用证书中指示的算法,接收者创建数据的新摘要,并将新摘要与签名中提供的摘要的解密副本进行比较。
如果它们匹配,则收到的数据必须与签名者创建的原始数据相同。


图1-3 验证数字签名

在这里插入图片描述


6、数字证书

A数字证书是用于验证证书持有者或发送者身份的数据集合。

例如,X.509 证书包含以下信息:

  • 结构信息——版本、序列号、用于创建签名的消息摘要算法等
  • 来自的数字签名认证机构(CA) — 颁发证书的个人或组织 — 确保证书未被更改,并表明颁发者的身份
  • 有关证书持有者的信息 - 姓名、电子邮件地址、公司名称、所有者的公钥等
  • 有效期(证书在此期限之前或之后均无效)
  • 证书扩展 —— 包含附加信息(例如此证书的允许用途)的属性

细心的读者会注意到,数字签名包含签名者的证书,而签名者的证书又包含带有另一个证书的数字签名。

一般来说,每张证书通过使用另一个证书进行验证,从而创建信任链- 证书链,每个证书都由链中的下一个证书进行数字签名,以根证书
此根证书的所有者称为根证书颁发机构
图 1-4说明了数字证书的各部分。


图 1-4 数字证书结构
在这里插入图片描述


根证书是自签名的,这意味着根证书的签名是由根证书颁发机构自己创建的。
图 1-5和图 1-6说明了如何创建和使用证书链。
图 1-5显示了根证书颁发机构如何创建自己的证书,然后为二级证书颁发机构创建证书。


图 1-5 创建根 CA 和辅助 CA 的证书
在这里插入图片描述


图 1-6显示了二级证书颁发机构如何为最终用户创建证书以及最终用户如何使用该证书签署文件。


图 1-6 为最终用户创建证书并使用该证书签署文档
在这里插入图片描述


在图 1-6中,文档的创建者已对文档进行签名。
签名表示文档创建者的证书(图中标记为用户)。
文档的创建者使用私钥对文档进行签名,签名证书包含相应的公钥密钥,可用于解密消息摘要以验证签名(前面在“数字签名”中介绍过)。
此证书(连同私钥和公钥)由认证机构提供(加州)。

为了验证用户证书的有效性,证书使用 CA 的证书进行签名。
CA 的证书包含解密用户证书消息摘要所需的公钥。
继续证书链中,CA 的证书是使用颁发该证书的机构的证书进行签名的。
该链可以经过任意数量的中间证书,但在图 1-5中,CA 证书的颁发者是根证书颁发机构。
请注意,与其他证书不同,根 CA 的证书是自签名的 — 也就是说,它不引用其他证书颁发机构,而是使用根 CA 自己的私钥进行签名。

当 CA 创建证书时,它使用其私钥来加密证书的消息摘要。
CA 颁发的每个证书的签名都引用其自己的签名证书。
CA 的公钥位于此证书中,验证签名的应用程序必须提取此密钥才能验证 CA 的证书。
因此,它继续沿着证书链向下,直到根 CA 的证书。
当根 CA 颁发证书时,它也会对该证书进行签名。
但是,此签名证书不是由另一个 CA 颁发的;证书链到此结束。
相反,根 CA 颁发自己的签名证书,如图1-5所示。

可以通过创建摘要并将其与广泛使用的摘要进行比较来验证根 CA 的证书。
通常,根证书和根 CA 的公钥已存储在需要验证签名的应用程序或计算机上。

可以使用非根证书的受信任证书来结束证书链。
例如,证书可以被认证为受用户信任,也可以进行交叉认证(即使用多个证书链进行签名)。
受信任用于认证其他证书(包括根证书和其他证书)的证书的通用术语是锚证书
由于大多数锚证书都是根证书,因此这两个术语经常互换使用。

您对给定证书的信任程度取决于您对锚证书的信任程度;例如,您对证书颁发机构及其确保证书链中后续证书接收者完全经过身份验证的程序的信任程度。
因此,检查带有数字签名的证书始终是一个好主意,即使签名看起来有效。
在 macOS 和 iOS 中,您收到的所有证书都存储在钥匙串中。
在 macOS 中,您可以使用 Keychain Access 实用程序来查看它们。

数字证书的某些属性(称为证书扩展)提供了有关证书的其他信息。
其中一些扩展描述了证书的预期用途。
例如,证书扩展可能表明密钥可用于代码签名,或可能提供 TLS 证书有效的其他域名列表。
其他扩展提供签名的时间戳,指示证书何时用于签署特定文档,从而允许您验证现已过期的证书在用于签署文档时是否有效。
还有一些扩展提供用于检查证书是否已被吊销的信息。
等等。

这些证书扩展是在信任策略 —— 一组规则,指定特定扩展如何影响证书是否应被信任用于给定用途。
例如,信任策略可能指定,为了被信任以验证数字签名的电子邮件消息,证书必须包含与电子邮件发件人地址相匹配的电子邮件地址。


三、加密和散列数据

您通常使用非对称加密来跨信任边界发送数据,例如一个人向另一个人发送加密电子邮件。
您还可以使用它通过不安全的通信渠道发送对称会话密钥,以便您可以在进一步的通信中使用对称加密。
另一方面,您经常使用对称加密来处理静态数据(例如硬盘上的数据),并将其用作许多加密网络方案中的会话密钥。


1、macOS 和 iOS 常见的加密技术

macOS 和 iOS 提供了多种加密技术,包括:

  • 钥匙串服务。
    使用 钥匙串服务参考 中描述的此 API ,将密码、密钥和其他小秘密加密并存储在一个称为钥匙串的特殊数据库中。
    通过以这种方式存储用户秘密,您可以确保它们保持安全(包括在设备备份中),而无需实施自己的加密算法或存储协议。
    在 Mac 上,您可以使用钥匙串访问应用检查钥匙串,如 安全概览 中的钥匙串访问中所述。
  • 证书、密钥和信任服务。
    此接口提供加密支持服务,包括常规加密和解密方法以及信任验证。
    有关详细信息,请参阅 证书、密钥和信任服务参考。
  • 加密消息语法。
    使用此服务可以加密或为 S/MIME 消息添加数字签名。
    S/MIME 是加密和签名消息的标准,最常用于电子邮件。
    有关更多信息,请参阅 加密消息语法服务参考。

2、特定于 macOS 的加密技术

macOS 提供了一些用于执行加密的附加 API:

  • 安全转换 API。
    安全转换 API 基于数据流编程的概念,可让您构建相互馈送的转换图,透明地使用 Grand Central Dispatch 在多个 CPU 之间高效地调度结果工作。
    当数据对象通过对象图时,每个转换中的回调都会对该数据进行操作,然后将其传递给转换的输出,该输出可能连接到另一个转换对象的输入,依此类推。
    使用内置转换,安全转换 API 允许您读取文件、执行对称加密和解密、执行非对称签名和验证以及执行 Base64 编码。
    安全转换 API 还支持创建自定义转换以对数据执行其他操作。
    例如,您可以创建一个在加密数据之前对其进行字节交换的转换,或者创建一个对生成的加密数据进行编码以便传输的转换。
    有关更多信息,请参阅安全转换参考
  • CDSA/CSSM。
    此开源安全架构提供各种安全服务,包括细粒度的访问权限、用户身份验证、加密和安全数据存储。
    不过,此接口从 macOS 10.7 开始已弃用,不应用于任何新应用。

四、管理密钥、证书和密码

钥匙用于存储密码、加密密钥、证书和其他小块数据。
其中一些数据本质上是秘密的,例如私钥和密码,而其他数据则不是,例如证书。
将数据存储在钥匙串中后,您可以确信不受信任的应用无法访问这些数据。
此外,设备备份仅包含秘密数据的加密版本。

使用以下 API 来处理钥匙串项目:

  • 钥匙串服务。
    使用钥匙串服务可明确添加、删除和编辑钥匙串项目,并管理钥匙串集合(仅限 macOS)。
    有关详细信息,请参阅 钥匙串服务参考。
  • 证书、密钥和信任服务。
    管理证书、公钥和私钥、对称密钥和信任策略。
    具体来说,您可以:
    • 创建证书和非对称密钥。
    • 将证书和密钥添加到钥匙串。
    • 检索有关证书的信息,例如与其关联的私钥、所有者等等。
    • 将证书转换为可移植表示形式或从可移植表示形式转换。
    • 创建和操作信任策略,并使用一组指定的信任策略评估特定证书。
    • 添加锚证书。
    • 为数据块生成或验证数字签名。
    • 加密或解密数据块。
      证书、密钥和信任服务对符合 X.509 ITU 标准的证书进行操作,使用钥匙串存储和检索证书和密钥,并使用 Apple 提供的信任策略。
      有关更多信息,请参阅 证书、密钥和信任服务参考。
  • 安全界面。
    要在 macOS 用户界面中显示证书的内容,您可以使用SFCertificatePanelSFCertificateView类。
    此外,SFCertificateTrustPanel类显示信任决策并允许用户编辑信任决策。

五、生成随机数

许多加密算法依赖于密码强度高的伪随机数。
使用随机化服务生成这些数字。
有关更多信息,请阅读 随机化服务参考


六、安全传输数据

计算机安全的一个重要方面是通过网络安全地传输数据。
虽然您可以设计自己的安全协议并使用低级 API 来实现它们,但最好尽可能使用标准协议以及支持它们的最高级别 API。

安全套接字层 (SSL) 协议及其后继协议传输层安全 (TLS) 协议为网络上的安全通信提供支持。
它们通常用于 TCP/IP 连接,例如 Internet。
它们使用基于证书的身份验证来确保您与有效的服务器进行通信,它们验证数据以防止篡改,并且它们可以使用公钥加密来防止窃听或消息伪造。

SSL 和 TLS 内置于所有主流浏览器和 Web 服务器中。
每当您使用安全网站(例如,通过互联网向供应商发送您的信用卡号)并在 URL 开头看到协议标识符https而不是http时,您就正在使用 SSL 或 TLS 进行通信。

注意: 尽管 TLS 协议本身不能与 SSL 协议互操作,但如果无法与连接的另一端协商 TLS 会话,则 TLS 协议的 macOS 和 iOS 实现将回退到使用 SSL 3.0 协议。

有多种方法可以利用 SSL 和 TLS:

  • 从高层次上讲,您可以将httpsURL 与 URL 加载系统(NSURL类、CFURL 函数和相关类)一起使用。
  • 在较低级别,您可以使用 CFNetwork API 来协商 SSL 或 TLS 连接。
  • 为了实现最大程度的控制,您可以使用 macOS 或 iOS 5.0 及更高版本中的安全传输 API。

除了这些 API 之外,许多开源工具还使用 OpenSSL 实现安全网络连接。
如果您在公开发布的应用中使用 OpenSSL,则必须提供自己的 OpenSSL 库副本,最好作为应用包的一部分;macOS 提供的 OpenSSL 库已被弃用。


1、使用 URL 加载系统

URL 加载系统是一种非常高级的 API,可用于访问HTTP://HTTPS://FTP://URL 的内容。
由于 URL 加载系统可与安全https://URLs 配合使用,因此可用于安全地传输数据。

当您需要从远程服务器下载资源时,应使用 URL 加载系统。
与 CFNetwork 不同,此 API 不维护连续的数据流。
当它满足您的需求时,这使其成为移动用途的更好选择(尤其是蜂窝网络,当您从一个基站切换到另一个基站时,您的 IP 号码可能会发生变化)。


2、CFNetwork

CFNetwork 是一种用于通过网络创建、发送和接收序列化消息的 API。
它提供了比安全传输更高级别的接口,应用可以使用它来设置和维护安全的 SSL 或 TLS 网络会话,并向消息添加身份验证信息。

CFNetwork包含以下与安全相关的组件:

  • CFHTTPMessage,可用于创建、序列化、反序列化和管理 HTTP 协议消息。
    如果您需要向消息添加身份验证信息,则应使用 CFHTTPMessage API,而不是其他 CFHTTP API。
  • CFHTTPAuthentication,将身份验证凭据应用于质询的 HTTP 消息。
    您可以将此 API 与 CHTTPMessage 结合使用。
  • CFStream Socket Additions,它分配读取和写入流,并提供与 CFReadStream 和 CFWriteStream API 一起使用的常量来设置安全协议。
    如果您需要设置流数据连接(而不是 HTTP 请求),则应使用 CFStream 对象。
  • CFFTPStream,您可以使用它通过文件传输协议 (FTP) 执行 FTP 文件传输。
    此组件允许您将密码发送到 FTP 服务器。

除了 CFNetwork API 之外,您还可以使用 Core Foundation 框架中的 CFReadStream 和 CFWriteStream API 来创建和管理 CFNetwork 所依赖的读写流。
您可以指定 SSL 或 TLS 协议版本来加密和解密数据流。
请注意,CFReadStream 和 CFWriteStream 与其 Cocoa Foundation 对应类和 是“免费桥接”的NSInputStream
NSOutputStream这意味着每个 Core Foundation 类型都可以在函数或方法调用中与相应的桥接 Foundation 对象互换,因此您可以使用 C 或 Objective C 接口,无论哪种对您来说最方便。


3、安全传输

安全传输 是用于 SSL 和 TLS 的低级 API。
使用安全传输时,您的代码必须设置网络连接并提供回调函数,供安全传输调用以通过网络执行 I/O 操作。

CFNetwork 和 URL 加载系统 API 建立在安全传输之上。

您可以使用安全传输 API 来设置安全会话的参数、打开和维护会话以及关闭会话。
但是,由于安全传输是一个相当复杂的 API,因此通常只有在您需要比使用 CFNetwork 所能获得的更多控制时才应直接使用安全传输。

安全传输 API 可让您:

  • 选择应允许哪些协议(SSL/TLS 版本)和密码套件,以及(连接后)确定实际协商的协议和密码套件。
  • 指定密钥交换的 Diffie-Hellman 参数
  • 指定是否需要客户端身份验证并获取该身份证明。
  • 管理证书和信任策略——指定用于客户端或服务器识别的证书、指定确定其他主机的证书是否有效时使用的域名、为过期证书和未知或过期的根证书提供信任策略、添加其他受信任的根证书等等。

安全传输没有传输层依赖;它可以与 BSD 套接字、开放传输或任何其他可用的传输层协议一起使用。


4、OpenSSL

macOS 包含一个 OpenSSL 开源加密工具包的低级命令行界面;此界面在 iOS 中不可用。

尽管 OpenSSL 在开源社区中被广泛使用,但它并未提供各个版本之间稳定的 API。
因此,OpenSSL 的编程接口在 macOS 中已弃用,并且在 iOS 中不提供。
强烈建议不要让应用使用 Apple 提供的 OpenSSL 库。

为确保兼容性,如果您的应用依赖于 OpenSSL,您应该自行编译它并将已知版本的 OpenSSL 静态链接到您的应用中。
这种用法适用于 iOS 和 macOS。

但是,一般来说,您应该使用 CFNetwork API 来实现安全网络连接,使用证书、密钥和信任服务 API 来实现加密服务。
或者,在 macOS 中,您可以使用安全传输 API。


5、了解更多

要了解与网络通信相关的其他安全问题,请阅读 网络概述 中的安全使用网络。

有关 TLS 标准的更多信息,请参阅IETF 的 TLS 工作组网站。

要了解有关 CFNetwork 的更多信息,请阅读 CFNetwork 编程指南

要开始使用安全传输,请参阅 安全传输参考


七、CDSA 概述

重要提示: 此技术从 macOS 10.7 开始已弃用,并且在 iOS 中不可用。
本章中的信息仅供参考。
请勿将此 API 用于任何新应用。
相反,请使用整个安全框架中提供的更高级别的 API。

加拿大唱片业协会 是开放组织采用的技术标准,是一种开放源代码安全架构。
Apple 开发了自己的 CDSA 开放源代码实现,作为 Darwin 的一部分在Apple 的开放源代码网站上提供。
CDSA 的核心是
CSSM
(通用安全服务管理器),一组实现公共应用程序编程接口(称为 CSSM API)的开源代码模块。
CSSM 提供加密服务(例如创建加密密钥、加密和解密数据)、证书服务(例如创建数字证书、读取和评估数字证书)、数据的安全存储和其他安全服务的 API(有关更完整列表,请参阅Apple CDSA 插件)。

CSSM 还定义了一个插件接口,用于为特定操作系统和硬件环境实现安全服务。
给定平台上的实现可以选择性地提供一个中间件层,为应用程序提供特定于操作系统的 API。
无论是否存在这样的层,应用程序都可以直接调用 CSSM API。

OS X 实现了 CSSM 的几乎所有标准功能,以及一组中间件安全服务,为应用程序程序员提供 OS X 标准界面。
此外,为了增强最敏感操作的安全性,OS X 实现将安全服务器守护程序作为单独的进程运行。
安全服务器守护程序启动另一个进程,即安全代理,它充当安全服务器的用户界面。

图 A-1说明了 CDSA 的 OS X 实现。
CDSA 标准定义了一个四层架构,最顶层是使用 CDSA 安全功能的应用程序。
图 A-1显示了前三层:CDSA 插件、CSSM 和 OS X 安全 API,它们构成了规范中提到的中间件层。
图中显示的 OS X 授权服务 API、安全服务器守护程序和安全代理在技术上不属于 CDSA,但为了完整起见,在这里显示了它们,因为它们构成了 OS X 安全架构的一个组成部分。


图 A-1 OS X 上的 CDSA 实现

在这里插入图片描述


安全上下文(参见图 A-1)是 CSSM 使用的数据结构,用于帮助应用程序管理安全操作中使用的许多参数。
CSSM 管理器实现了标准 CSSM API。
(CDSA 标准中定义的第五个管理器称为授权计算服务管理器未在 OS X 中实现。
OS X 授权服务不使用 CSSM API,而是直接调用安全服务器守护程序。)

这图 A-1中显示的 CDSA 插件是作为 OS X 的一部分提供的插件。
CDSA 规范允许使用任意数量的插件。
只要插件遵循与 CSSM 管理器交互的规则,它就可以实现 CDSA 功能集的任何部分,包括与两个或更多 CSSM 管理器相关的功能组合。
(请参阅AppleCSP/DL 模块,了解多服务 CDSA 插件的示例。)CDSA 规范甚至允许通过添加可选模块管理器和相关插件来扩展 CDSA。
插件可以相互调用,也可以被 CSSM 管理器调用 — 事实上,它们这样做很常见。

有关 CDSA 的介绍,请参阅Open Group 的*《CDSA Explained*》第二版。
CDSA/CSSM 技术标准是Common Security: CDSA and CSSM第二版(附勘误表),也是 Open Group 的版本。

只要您使用 OS X 安全 API,就不必担心 OS X CDSA 实现的细节。
但是,由于调用 CSSM API 允许您指定要将请求定向到的插件模块,因此如果您想直接调用 CSSM,您应该对 OS X CDSA 插件有所了解。


1、Apple CDSA 插件

OS X 的 CDSA 实现包括五个CDSA 插件(见图A-1):

  • AppleCSP 加密服务提供商
  • AppleFileDL 数据存储库
  • AppleCSP/DL 加密数据存储提供商
  • AppleX509CL 证书库
  • AppleX509TP 信任策略库

本节简要介绍每个模块的目的和功能。
(有关任何不熟悉术语的解释,请参阅词汇表。)


AppleCSP 模块

所有安全通信和身份验证协议都基于密钥和加密。
Apple 加密服务提供程序 (AppleCSP) 是一个基本插件模块,由多个安全服务用于创建加密密钥以及加密或解密数据。
数字签名还使用 AppleCSP 模块来创建用于创建和验证签名的消息摘要。
CSP 可以使用任意数量的算法。


AppleFileDL 模块

数据存储库(DL)模块提供安全存储 —— 即在磁盘或其他介质上存储加密数据,即使电源关闭,数据仍会保留。
CDSA 标准允许 DL 模块使用任何类型的数据库或其他数据存储。
为简单起见,AppleFileDL 模块将其数据存储在 OS X 文件系统的文件中。
它提供 AppleCSP/DL 插件使用的较低级别的服务,用于在keychain,Apple 用于存储加密密码、私钥和其他机密的数据库。


AppleCSP/DL 模块

这AppleCSP/DL插件是一个多功能模块,结合了加密服务和数据存储功能,实现了Apple钥匙串,用于存储密码、密钥和其他机密信息。
AppleCSP/DL 模块调用 AppleFileDL 模块执行文件 I/O,并调用 Security Server 守护程序来加密和解密机密信息。


AppleX509CL 模块

A证书库 (CL) 模块对数字证书执行操作。
数字证书用于建立或确认实体(如网站或数字签名消息的发送者)的身份。
它们通过使用数字签名以确保只有已识别的实体才能提供证书(请参阅数字证书)。
CL 模块执行以下功能:创建新证书(在内存中)、创建证书吊销列表(指示哪些证书不再有效)、验证证书中包含的数字签名以及从证书中提取信息。
CL 模块不存储证书的永久副本。
相反,DL 模块用于此目的。

AppleX509CL 插件为证书执行这些功能符合国际电信联盟(ITU)颁布的X.509标准。
X.509 ITU 标准广泛应用于互联网和整个信息技术行业,用于设计基于公钥基础设施(创建和管理基于公钥加密的数字证书所需的硬件、软件、人员、策略和程序的集合)。
有关公钥的更多信息,请参阅非对称密钥。


AppleX509TP 模块

A数字证书具有与其关联的信任级别,该级别基于证书的属性。
信任策略是一组规则,用于指定在特定信任级别下可以采取的操作。
换句话说,为证书建立信任级别的目的是回答“我是否应该信任此证书来执行此操作?”这个问题。

数字证书的颁发者在证书中添加数字签名,以确保证书未被更改,并验证颁发者的身份。
一般来说,数字签名是通过使用另一个证书来验证的。
因此,每个证书通常都是证书链的一部分,证书链以根证书,无需借助其他证书即可进行验证(请参阅数字证书)。

注意: OS X 存储和维护的根证书集位于 /System/Library/Keychains/X509Anchors 的系统钥匙串中。
您可以在 Keychain Access 实用程序中浏览这些钥匙串(通过使用文件 > 添加钥匙串菜单项将它们添加到钥匙串列表中),以查看它们包含的内容以及证书链的构造方式。

A信任策略 (TP) 插件执行两个主要功能:它组装验证给定证书所需的证书链,并确定可授予该证书的信任级别。

AppleX509TP 模块使用 Apple 建立的信任策略在 X.509 证书上执行这些功能。


2、CSSM 服务

尽管 OS X 安全 API 提供了开发安全应用程序可能需要的所有功能,但几乎所有标准 CSSM API 也可供您使用。
本节简要介绍每个 CSSM 服务提供的功能。
有关详细信息,请参阅Open Group 的* 《通用安全:CDSA 和 CSSM*,版本 2(带勘误表)》。


加密服务

CSSM 中的加密服务提供执行以下任务的功能:

  • 加密和解密文本和数据
  • 创建和验证数字签名
  • 创建加密哈希(用于消息摘要和其他目的)
  • 生成对称和非对称加密密钥对
  • 生成伪随机数
  • 控制对 CSP 的访问以创建密钥

要确切了解 Apple 的 CSP 实现支持哪些安全协议和算法,请参阅开放源安全代码附带的文档(可在Apple 的开放源网站下载)以及 Apple 最新 Xcode 工具中的安全发行说明。


数据存储服务

CSSM 数据存储服务提供了一个用于存储和检索数据的 API,该 API 与所用的存储类型无关。
如果安装了多个 DL 模块,调用者可以查询数据存储服务以了解每个模块的功能,并选择在特定调用中使用哪个模块。
Apple 的数据存储服务实现支持任何标准 CDSA DL 插件模块。
AppleFileDL 数据存储库和 AppleCSP/DL 加密数据存储模块都实现了数据存储服务调用的函数。


证书服务

CDSA 指定的证书服务执行以下功能:

  • 验证证书和证书吊销列表上的签名
  • 创建证书和证书撤销列表
  • 签署证书和证书撤销列表
  • 从证书和证书撤销列表中提取字段值
  • 搜索指定证书的证书吊销列表

Apple 的证书服务实现支持 CDSA/CSSM 规范中的所有 CL API 功能。


信托政策服务

OS X 的 CSSM 信任策略服务实现提供了验证证书、确定证书所含属性以及可赋予证书的信任级别以及构建相关证书链的功能。
它未实现 CSSM 标准中的其他信任策略功能。
Apple 的 TP 实现支持的 CSSM 信任策略功能的文档可在开放源安全代码中找到,您可以在Apple 的开放源站点下载该代码。


授权计算服务

Apple 的 CSSM 实现不包括 CDSA 标准中定义的授权计算服务。
相反,授权服务 API 直接调用安全服务器守护程序(参见图 A-1)。


词汇表

  • anchor certificate | 锚证书
    被信任为有效的数字证书,然后可用于验证其他证书。
    锚证书可以是根证书、交叉认证证书(即使用多个证书链签名的证书)或本地定义的信任源。
  • CDSA
    通用数据安全架构 (Common Data Security Architecture) 的缩写。
    安全基础架构的开放软件标准,提供广泛的安全服务,包括细粒度访问权限、用户身份验证、加密和安全数据存储。
    CDSA 具有标准应用程序编程接口,称为CSSM。
    此外,OS X 还包含自己的安全 API,可为您调用 CDSA API。
  • certificate
    参见数字证书。
  • certificate chain | 证书链
    参见信任链。
  • certificate extension | 证书扩展
    数字证书中的数据字段,包含证书的允许用途等信息。
  • 证书、密钥和信任服务
    您可以使用该 API 创建、管理和读取证书;将证书添加到钥匙串;创建加密密钥;以及管理信任策略。
    在 iOS 中,您还可以使用此 API 加密、解密和签名数据。
  • 认证机构 (CA)
    数字证书的颁发者。
    为了使数字证书值得信任,证书颁发机构必须是一个值得信任的组织,在颁发证书之前对申请人进行身份验证。
  • chain of trust | 信任链
    一组数字证书,其中每个证书都签署下一个证书,最后以根证书结尾,该根证书也是受信任的 锚证书。
    信任链可用于验证数字证书的有效性。
  • cipher
    一种加密数据的方案。
  • ciphertext | 密文
    已加密的文本或其他数据。
    请比较明文。
  • cleartext | 明文
    普通的、未加密的数据。
    比较密文。
  • cryptographic hashing | 加密哈希
    将数据转换为更小的值以代替原始数据以用于加密目的的过程。
    哈希算法接受任意数量的数据并将其转换为固定大小的输出值。
    要使加密哈希函数对安全性有用,必须非常难以或不可能从哈希值重建原始数据,并且任何类似的输入数据产生相同输出值的可能性必须极小。
    另请参阅消息摘要。
  • CSSM
    Common Security Services Manager 的缩写。
    CDSA 的公共应用程序编程接口。
    CSSM 还定义了为特定操作系统和硬件环境实现安全服务的插件接口。
  • decryption | 解密
    将加密数据转换回原始明文。
    比较加密。
  • Diffie-Hellman 密钥交换
    一种协议,为通信会话的两端提供一种通过交换公钥来生成对称共享密钥的方法。
  • digest
    参见消息摘要。
  • digital certificate | 数字证书
    用于验证证书持有者或发送者身份的数据集合。
    OS X 和 iOS 支持数字证书的 X.509 标准。
    另请参阅证书链。
  • digital signature | 电子签名
    使用公钥加密技术确保消息或其他数据完整性的一种方法。
    要创建数字签名,签名者需要生成数据的消息摘要,然后使用私钥加密摘要。
    签名包括加密摘要并标识签名者。
    任何想要验证签名的人都可以使用签名者的数字证书,该证书包含解密摘要所需的公钥并指定用于创建摘要的算法。
  • encryption | 加密
    将数据转换为一种不使用密钥就无法理解的形式。
    这种转换后的数据称为密文
    使用密钥逆转此过程并将数据恢复为其原始(明文)形式称为解密。
  • hash algorithm | 哈希算法
    参见加密散列。
  • identity | 身份
    数字证书和相关的私钥。
  • keychain | 钥匙链
    OS X 和 iOS 中的数据库,用于存储加密密码、私钥和其他机密信息。
    它还用于存储用于加密和身份验证的证书和其他非机密信息。
    应用可以使用 Keychain Services API(或旧版 Keychain Manager API)来操作钥匙串中的数据。
    用户还可以使用 Keychain Access 实用程序访问钥匙串数据。
  • man-in-the-middle attack | 中间人攻击
    对通信渠道的攻击,攻击者可以在通信双方不知情的情况下拦截双方之间的消息。
    通常,中间人会替换消息甚至加密密钥,以冒充一方。
  • 信息摘要
    将加密哈希函数应用于消息或其他数据的结果。
    加密安全的消息摘要无法转换回原始消息,也无法(或不太可能)从其他输入创建。
    消息摘要用于确保消息未被破坏或更改。
    例如,它们用于数字签名。
    数字签名包括原始消息的摘要,接收者准备自己对收到的消息的摘要。
    如果两个摘要相同,则接收者可以确信消息未被更改或破坏。
  • plaintext | 纯文本
    参见明文。
  • private key | 私钥
    必须保密的加密密钥,通常用于公钥加密。
    虽然此术语也可以用于对称密钥加密,但更倾向于使用术语“秘密密钥”(或“共享秘密”)。
  • pseudorandom number | 伪随机数
    由算法生成的数字,该算法会生成一系列没有可辨别模式的数字。
    从这样的数字序列中推断出算法应该是不可能或几乎不可能的。
    但是,与真正的随机数生成器不同,如果算法的起始值相同,伪随机数生成器总是会生成相同的数字序列。
  • public-private key pair | 公私钥对
    公钥密码术中使用的一对数学上相关的密钥,彼此之间不能相互推导。
    其中一个密钥(公钥)公开,而另一个密钥(私钥)保密。
    用一个密钥加密的数据必须用另一个密钥解密。
  • public key | 公钥
    可以共享或公开而不会泄露加密方法的加密密钥 - 通常为公钥-私钥对的公开部分。
    另请参阅公钥加密。
  • public key certificate | 公钥证书
    参见数字证书。
  • public key cryptography | 公钥加密
    使用公钥-私钥对的加密方法。
    如果使用公钥加密数据,则只有私钥的持有者才能解密;因此数据不会被未经授权使用。
    如果使用私钥加密数据,则任何拥有公钥的人都可以解密。
    由于只有私钥的持有者才能加密数据,因此此类数据可用于身份验证。
    另请参阅数字证书;数字签名。
    比较对称密钥加密。
  • root certificate | 根证书
    无需借助其他证书即可验证的证书。
    根证书不是由其他认证机构 (CA) 签名,而是使用颁发根证书的 CA 的广泛使用的公钥进行验证。
    比较锚证书。
  • root certification authority | 根证书颁发机构
    拥有根证书的证书颁发机构。
  • RSA 加密
    一种公钥加密系统,以其发明者 Ron Rivest、Adi Shamir 和 Leonard Adleman 的名字命名。
    RSA 算法采用两个大素数,求出它们的乘积,然后从素数及其乘积中得出公钥-私钥对。
    该算法的强度取决于对所得乘积进行因式分解的难度以及对用于构造密钥的值的素性的合理保证。
  • secret key | 密钥
    不能公开的加密密钥,否则会损害加密方法的安全性。
    在对称密钥加密中,密钥既用于加密数据,也用于解密数据,通常称为共享密钥
    虽然“密钥”一词可以在公钥加密中使用,但“私钥”一词更受欢迎。
  • Secure Sockets Layer (SSL) | 安全套接字层 (SSL)
    一种通过 TCP/IP 连接(如 Internet)提供安全通信的协议。
    它使用数字证书进行身份验证,使用数字签名来确保消息完整性,并可以使用公钥加密来确保数据隐私。
    SSL 服务在两个通信端点之间协商安全会话。
    所有主流浏览器和 Web 服务器都内置了 SSL。
    SSL 已被传输层安全性 (TLS)取代。
  • secure storage | 安全存储
    将加密数据存储在磁盘或其他介质上,即使电源关闭,数据仍会保留下来。
  • Secure Transport | 安全传输
    安全套接字层 (SSL) 和传输层安全性 (TLS) 的 OS X 和 iPhone 实现,用于在 TCP/IP 连接(如 Internet)上创建安全连接。
    安全传输包含一个独立于底层传输协议的 API。
    CFNetwork 和 URL 加载系统 API 使用安全传输的服务。
  • session key | 会话密钥
    仅在特定通信会话期间计算或发布的加密密钥。
    会话密钥由 SSL 和 Kerberos 协议等使用,通常使用Diffie-Hellman 密钥交换获得。
  • SSL
    请参阅安全套接字层 (SSL)。
  • strength
    衡量破解安全系统所需努力的程度。
    例如,人们认为 RSA 加密的强度与分解两个大素数乘积的难度有关。
  • symmetric key cryptography
    使用单个共享密钥加密和解密数据的密码术。
    另请参阅密钥。
    比较公钥密码术。
  • TLS
    请参阅传输层安全性 (TLS)。
  • Transport Layer Security (TLS)
    一种通过 TCP/IP 连接(例如 Internet)提供安全通信的协议。
    它使用证书进行身份验证和签名以确保消息完整性,并可以使用公钥加密来确保数据隐私。
    TLS 服务在两个通信端点之间协商安全会话。
    TLS 内置于所有主流浏览器和 Web 服务器的最新版本中。
    TLS 是 SSL 的后继者。
    虽然 TLS 和 SSL 协议不可互操作,但如果无法协商 TLS 会话,安全传输可以回退到 SSL 3.0。
  • trust policy | 信任政策
    一组规则,根据证书扩展名和其他信任标准指定证书的适当用途。
    例如,标准信任策略指定应提示用户是否允许信任已过期的证书。
    但是,自定义信任策略可能会在某些特定情况下覆盖该行为,例如在验证文档上的签名时,您知道该文档是在证书仍然有效时生成的。
  • X.509
    国际电信联盟 (ITU) 颁布的数字证书标准。
    X.509 ITU 标准在互联网和整个信息技术行业中被广泛用于设计基于公钥基础设施 (PKI) 的安全应用程序。

2024-06-16(日)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733175.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python字符串如何删除后几位

1、首先在jupyter notebook中新建一个空白的python文件: 2、然后定义一个字符串,用字符串截取的方式打印出排除最后三个字符的结果,这里的“s[:-3]”的意思就是从字符串取第0个字符至倒数第三个字符的前一个字符,这样就截取了最后…

别再滥用std::async了,strace命令暴露了一个乱开线程问题

用strace查看进程的系统调用后,发现一个std::async滥用问题 问题现象 进程的系统调用clone次数持续增加 使用工具strace发现进程clone系统调用过多且一直在增加 strace -c -p PID问题分析 clone在做什么:创建进程(线程) 查看…

基于Redis和openresty实现高并发缓存架构

目录 概述缓存架构设计实践代码路由业务封装redis 效果 概述 本文是对项目中 QPS 高并发相关问题的一种解决方案,利用 Nginx 与 Redis 的高并发、超低延迟响应,结合 Canal 进行实现。 openrestry官网 当程序需要提供较高的并发访问时,往往需…

算出未来——2024年,计算机相关专业仍是热门

随着高考结束,数百万考生和家长们开始着手专业选择与志愿填报。 选择大学专业不仅关乎未来四年的学习生涯,更可能决定一个人一生的职业方向和人生轨迹。 在众多专业中,计算机相关专业因其广泛的就业前景和不断变化的行业需求,一…

tauri中从前端ts调用rust函数,并异步收到响应结果

在前端是可以异步调用rust代码的,而且还是挺简单的逻辑,一共就三步:定义rust函数,注入到invoke_handler中,在前端调用。有英文能力的可以看官方文档:Calling Rust from the frontend | Tauri Apps 没有英文…

C++拷贝构造函数、运算符重载函数、赋值运算符重载函数、前置++和后置++重载等的介绍

文章目录 前言一、拷贝构造函数1. 概念2. 特征3. 编译器生成默认拷贝构造函数4. 拷贝构造函数典型使用场景 二、运算符重载函数三、赋值运算符重载函数1. 赋值运算符重载格式2. 赋值运算符只能重载成类的成员函数不能重载成全局函数3.编译器生成一个默认赋值运算符重载 四、前置…

WebSocket走私实践(附赠LiveGBS监控系统未授权管理员密码重置)

WebSocket走私实践(附赠LiveGBS监控系统未授权管理员密码重置) 对此,我特别感谢TryHackMe和HackTheBox academy,永远相信和追随英国TryHackMe所教导的网络安全知识,并保持学习 WebSocket走私相关的知识在这里 前段时间学习过htt…

Spring的自动注入(也称为自动装配)

自动注入(也称为自动装配)是Spring框架中的一个核心概念,它与手动装配相对立,提供了一种更简洁、更灵活的方式来管理Bean之间的依赖关系。 在Spring应用程序中,如果类A依赖于类B,通常需要在类A中定义一个类…

[Redis]缓存常见问题解决(缓存穿透、击穿、雪崩一文解决!通俗易懂、代码实战!手把手教你解决缓存问题三兄弟!)

Redis常见问题解决 要求 只用一种缓存技术,从实验点中挑一些试验进行试验原理。 1.缓存原理 目标:理解缓存的基本原理和工作机制。 实验步骤: 阅读各缓存技术机制的文档和官方资料。实现一个简单的应用程序,模拟数据的读写和…

ffmpeg+nginx+video实现rtsp流转hls流,web页面播放

项目场景: 最近调试海康摄像头需要将rtsp流在html页面播放,因为不想去折腾推拉流,所以我选择ffmpeg转hls流,nginx转发,html直接访问就好了 1.首先要下载nginx和ffmpeg 附上下载地址: nginx nginx news ffmpeg htt…

Java开发-面试题-0006-DELETE、VACUUM和TRUNCATE的区别

Java开发-面试题-0006-DELETE、VACUUM和TRUNCATE的区别 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术文) …

TF-IDF、BM25传统算法总结

1. TF-IDF算法 F-IDF(词频-逆文档频率)是一种用于衡量文本中词语重要性的方法,特别适用于信息检索和文本挖掘任务。下面会拆分为两部分深入讲解TF-IDF的计算过程,以便更好地理解。 TF-IDF的计算过程可以分为两个主要部分&#xf…

Butter Knife 8

// 部分代码省略… Override public View getView(int position, View view, ViewGroup parent) { ViewHolder holder; if (view ! null) { holder (ViewHolder) view.getTag(); } else { view inflater.inflate(R.layout.testlayout, parent, false); holder new ViewHolde…

Ansible 自动化运维实践

随着 IT 基础设施的复杂性不断增加,手动运维已无法满足现代企业对高效、可靠的 IT 运维需求。Ansible 作为一款开源的自动化运维工具,通过简洁易用的 YAML 语法和无代理(agentless)架构,极大简化了系统配置管理、应用部…

物理层(二)

2.2 传输介质 2.2.1 双绞线、同轴电缆、光纤和无线传输介质 传输介质也称传输媒体,是数据传输系统中发送器和接收器之间的物理通路。传输介质可分为:①导向传输介质,指铜线或光纤等,电磁波被导向为沿着固体介质传播:②)非导向传输介质&…

6月27日云技术研讨会 | 中央集中架构新车型功能和网络测试解决方案

会议摘要 “软件定义汽车”新时代下,整车电气电气架构向中央-区域集中式发展已成为行业共识,车型架构的变革带来更复杂的整车功能定义、更多的新技术的应用(如SOA服务化、TSN等)和更短的车型研发周期,对整车和新产品研…

【yolov8语义分割】跑通:下载yolov8+预测图片+预测视频

1、下载yolov8到autodl上 git clone https://github.com/ultralytics/ultralytics 下载到Yolov8文件夹下面 另外:现在yolov8支持像包一样导入,pip install就可以 2、yolov8 语义分割文档 看官方文档:主页 -Ultralytics YOLO 文档 还能切…

GLM-4V模型学习

智谱AI引领技术前沿,推出了新一代预训练模型GLM-4系列,其中的GLM-4-9B作为开源版本,展现了其在人工智能领域的深厚实力。在语义理解、数学运算、逻辑推理、代码编写以及广泛知识领域的数据集测评中,GLM-4-9B及其人类偏好对齐的版本…

AI音乐模型:创新还是颠覆?

文章目录 AI音乐大模型的崛起音乐创作门槛的降低与兴奋AI音乐作品的版权归属问题创意产业在AI阴影下的生长结语 🎉欢迎来到AIGC人工智能专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客&…

Apple - Text System Storage Layer Overview

本文翻译整理自:Text System Storage Layer Overview(更新日期:2012-09-19 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextStorageLayer/TextStorageLayer.html#//apple_ref/doc/uid/10000087i 文章目录 …