加密服务学习笔记

标签: 程序设计 加密 | 发表时间:2012-05-06 02:41 | 作者:标点符
出处:http://www.biaodianfu.com

公共网络(如 Internet)不提供实体间安全通信的方法。这种网络上的通信容易被未经授权的第三方读取甚至修改。加密有助于防止他人查看数据,它提供了检测数据是否已被修改的方式,同时有助于在非安全信道上提供安全的通信方式。例如,可以使用加密算法对数据进行加密,在加密状态下传输数据,然后由预定的接收方对数据进行解密。如果第三方截获了加密的数据,解密数据是很困难的。

一、加密基元

在使用加密的典型场合中,双方(Alice 和 Bob)在不安全的信道上通信。Alice 和 Bob 想要确保任何可能正在侦听的人无法理解他们之间的通信。而且,由于 Alice 和 Bob 相距遥远,因此 Alice 必须确保她从 Bob 处收到的信息没有在传输期间被任何人修改。此外,她必须确保信息确实是来自 Bob,而不是来自模仿 Bob 的人。

加密用于达到以下目的:

  • 保密性:帮助保护用户的标识或数据不被读取。
  • 数据完整性:帮助保护数据不被更改。
  • 身份验证:确保数据发自特定的一方。
  • 不可否认性:防止特定的一方否认发送过消息。

为了达到这些目的,您可以使用算法和惯例的组合(称作加密基元)来创建加密方案。下表列出了加密基元及它们的用法。

  • 私钥加密(对称加密)- 对数据执行转换,使第三方无法读取该数据。此类型的加密使用单个共享的机密密钥来加密和解密数据。
  • 公钥加密(不对称加密)- 对数据执行转换,使第三方无法读取该数据。此类加密使用公钥/私钥对来加密和解密数据。
  • 加密签名 - 通过创建对特定方唯一的数字签名来帮助验证数据是否发自特定方。此过程还使用哈希函数。
  • 加密哈希 - 将数据从任意长度映射为定长字节序列。哈希在统计上是唯一的;不同的双字节序列不会哈希为同一个值。

二、私钥加密

私钥加密算法使用单个私钥来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密您的数据,或加密他们自己的数据并声称该数据源自您,因此必须保护密钥不被未经授权的代理得到。

私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。私钥加密算法的速度非常快(与公钥算法相比),它特别适用于对较大的数据流执行加密转换。从数学角度而言,非对称加密算法(例如 RSA)在可加密的数据量方面存在限制。对称加密算法一般则没有这些问题。

有一种私钥算法称为分组加密,它用于一次加密一个数据组。分组加密(例如数据加密标准 (DES)、TripleDES 和高级加密标准 (AES))可将 n 字节的输入组通过加密转换为由加密字节构成的输出组。如果要加密或解密字节序列,必须逐组进行。由于 n 很小(DES 和 TripleDES 为 8 字节;AES 为 16 字节 [默认值]、24 字节或 32 字节),因此如果数据值大于 n,则必须一次加密一组。如果数据值小于 n,则必须将其扩展为 n 才能进行处理。

有一种简单的分组加密称为电子密码本 (ECB) 模式。一般认为,ECB 模式并不安全,因为它并不使用初始化向量初始化第一个纯文本组。对于给定的私钥 k,一个不使用初始化向量的简单组密码会将相同的纯文本输入分组加密为相同的密码文本输出组。因此,如果输入纯文本流中存在重复的组,则输出密码文本流中也将存在重复的组。这些重复的输出组会使未经授权的用户察觉数据可能采用了不可靠的加密算法,进而想出可能的攻击模式。因此,ECB 密码模式十分易于分析,因此最终会被他人发现密钥。

基类库中提供的分组加密类使用一种称为密码组链 (CBC) 的默认链模式,但您可以根据需要更改此默认设置。

通过使用初始化向量 (IV) 加密第一个纯文本组,CBC 密码克服了与 ECB 密码关联的问题。每个后续纯文本组都会在加密前与前一个密码文本组进行按位“异或”(XOR) 运算。因此,每个密码文本组都依赖于它前面的所有组。采用这种系统时,即使未经授权的用户可能已知道公共消息头,也无法将其用于对密钥进行反向工程。

使用 CBC 密码加密数据时,危及数据安全的一种做法是对每个可能的密钥执行穷举搜索。根据执行加密时使用的密钥大小,即便使用最快的计算机,这种搜索也可能极为耗时,因而此做法并不可行。使用较大的密钥大小将使解密更加困难。从理论上说,加密并不能防止对手检索到加密的数据,但它确实增加了这样做的成本。如果执行穷举搜索需要三个月才能检索到只在几天内有意义的数据,那么穷举搜索方法就并不实用。

私钥加密的缺点是它假定双方已就密钥和 IV 达成协议,并且互相传达了密钥和 IV 的值。一般认为,IV 并不安全,且可以在消息的纯文本中传输。但是,密钥必须对未经授权的用户保密。由于存在这些问题,因此通常将私钥加密与公钥加密配合使用,以秘密地传达密钥和 IV 的值。

假定 Alice 和 Bob 是希望在非安全信道上通信的双方,他们可以按如下方式使用私钥加密:Alice 和 Bob 同意对特定的密钥和 IV 应用一种特定的算法(例如 AES)。Alice 撰写一条消息并创建要在其上发送该消息的网络流(可能是一个命名管道或网络电子邮件)。接下来,她使用该密钥和 IV 加密文本,并通过 Intranet 向 Bob 发送该加密消息和 IV。Bob 在收到该加密文本后,可使用 IV 和预先商定的密钥对它进行解密。即使传输的内容被人截获,截获者也无法恢复原始消息,因为他并不知道密钥。在此方案中,只有密钥必须保密。在一个实际方案中,将由 Alice 或 Bob 生成私钥并使用公钥(不对称)加密将私钥(对称)传递给对方。有关公钥加密的更多信息,请参见下一节。

三、公钥加密

公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥在数学上是关联在一起的;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以提供给任何人;公钥用于对要发送到私钥持有者的数据进行加密。公钥加密算法又称为非对称算法,原因是需要用一个密钥加密数据,而用另一个密钥来解密数据。基本的加密规则禁止密钥重用,并且对于每一个通信会话公钥和私钥都应该是唯一的。但实际上,非对称密钥通常可持续使用。

双方(Alice 和 Bob)可以按照下列方式使用公钥加密:首先,Alice 生成一个公钥/私钥对。如果 Bob 想要给 Alice 发送一条加密的消息,他将向她索要她的公钥。Alice 通过非安全网络将她的公钥发送给 Bob,Bob 接着使用该密钥加密消息。Bob 将加密的消息发送给 Alice,而 Alice 使用她的私钥解密该消息。如果 Bob 通过非安全信道(例如公共网络)接收 Alice 的密钥,则 Bob 可能会受到“中间人”攻击。因此,Bob 必须与 Alice 验证他收到的公钥副本是否正确。

在传输 Alice 的公钥期间,未经授权的代理可能会截获该密钥。而且,同一代理可能截获来自 Bob 的加密消息。但是,该代理无法用公钥解密该消息。该消息只能用 Alice 的私钥解密,而该私钥并没有被传输。Alice 不使用她的私钥加密给 Bob 的答复消息,原因是任何具有公钥的人都可以解密该消息。如果 Alice 想要将消息发送回 Bob,她将向 Bob 索要他的公钥并使用该公钥加密她的消息。然后,Bob 使用与他相关联的私钥来解密该消息。

在此方案中,Alice 和 Bob 使用公钥(非对称)加密来传输私钥(对称),并对其会话的其余部分使用私钥加密。

下表对公钥加密算法和私钥加密算法进行了比较:

  • 公钥加密算法使用固定的缓冲区大小,而私钥加密算法则使用长度可变的缓冲区。
  • 公钥算法无法像私钥算法那样将数据链接成流,原因是它只能加密少量数据。因此,不对称操作不使用与对称操作相同的流模型。
  • 公钥加密比私钥加密具有更大的密钥空间(或密钥的可能值范围)。因此,公钥加密不太容易受到对每个可能的密钥都进行尝试的穷举攻击。
  • 由于公钥不需要保密,因此只要可通过某种方式来验证发送方的身份,分发公钥会十分容易。
  • 某些公钥算法(例如 RSA 和 DSA,但 Diffie-Hellman 除外)可用于创建数字签名,以此来验证数据发送方的身份。
  • 与私钥算法相比,公钥算法的速度很慢,不适合用来加密大量数据。公钥算法仅对传输很少量的数据有用。公钥加密通常用于加密一个私钥算法将要使用的密钥和 IV。在传输密钥和 IV 后,将对会话的其余部分应用私钥加密。

四、数字签名

公钥算法还可用于构成数字签名。数字签名验证发送方的身份(如果您信任发送方的公钥)并帮助保护数据的完整性。使用由 Alice 生成的公钥,Alice 的数据的接收者可以通过将数字签名与 Alice 的数据和 Alice 的公钥进行比较来验证是否是 Alice 发送了该数据。

为了使用公钥加密对消息进行数字签名,Alice 首先将哈希算法应用于该消息以创建消息摘要。该消息摘要是数据的紧凑且唯一的表示形式。然后,Alice 用她的私钥加密该消息摘要以创建她的个人签名。在收到消息和签名时,Bob 使用 Alice 的公钥解密签名以恢复消息摘要,并使用与 Alice 所使用的相同的哈希算法来散列消息。如果 Bob 计算的消息摘要与从 Alice 那里收到的消息摘要完全一致,Bob 就可以确定该消息来自私钥的持有人,并且数据未被修改过。如果 Bob 相信 Alice 是私钥的持有人,则他将知道该消息来自 Alice。

注意:由于发送方的公钥为大家所共知,并且它通常包含在数字签名格式中,因此任何人都可以验证签名。此方法不保守消息的机密;若要使消息保密,还必须对消息进行加密。

五、哈希值

哈希算法可将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值就称为哈希值。哈希值是一段数据的数值表示形式。散列一段纯文本时,即使只更改段落中的一个字母,随后的散列计算都会产生不同的值。如果哈希已进行强加密,其值将发生显著更改。例如,如果更改了消息的一个位,强哈希函数就可能生成相差 50% 的输出。很多输入值可能会散列为相同的输出值。但是,要找到散列为同一个值的两个不同的输入,在计算上是不可行的。

双方(Alice 和 Bob)可以使用一个哈希函数来确保消息的完整性。他们将选择一个哈希算法来签署其消息。Alice 将写一条消息,然后使用选定的算法创建该消息的哈希。然后他们将采用以下方法之一:

  • Alice 向 Bob 发送纯文本消息和哈希消息(数字签名)。Bob 接收该消息并对它进行哈希运算,将他的哈希值与从 Alice 那里接收的哈希值进行比较。如果这两个哈希值相同,则说明消息未被更改。如若不同,则说明该消息在由 Alice 撰写后已被他人更改。遗憾的是,此方法并没有确立发送方的真实性。任何人都可以模拟 Alice 向 Bob 发送消息。他们可以使用同一哈希算法来签署消息,Bob 能够确定的只是该消息与其签名匹配。这是中间人攻击的一种形式。
  • Alice 通过非安全公共通道向 Bob 发送纯文本消息。她通过一个安全的专用通道向 Bob 发送哈希消息。Bob 接收纯文本消息并对它进行哈希运算,将该哈希与私自交换的哈希进行比较。如果两个哈希匹配,则 Bob 可确定两点:
    • 该消息没有被篡改。
    • 消息的发送方 (Alice) 是可信的。

    为了使此系统发挥作用,Alice 必须对除 Bob 外的所有人保密其原始的哈希值。

  • Alice 通过非安全公共通道向 Bob 发送纯文本消息,并将哈希消息置于她的公开网站上。该方法通过防止任何人修改哈希值而防止了消息被篡改。尽管任何人都可以读取消息及其哈希,但只有 Alice 能够更改哈希值。要模拟 Alice 的攻击者将需要访问 Alice 的网站。

由于 Alice 的消息是以纯文本形式传输的,因此前面的任何方法都无法防止他人读取 Alice 的消息。完整安全性通常需要数字签名(消息签名)和加密。

注意:1996 年,人们发现了 MD5 的设计缺陷,并建议改用 SHA-1。2004 年,人们又发现了 MD5 的其他缺陷,因此认为这种算法已不再安全。另外,SHA-1 算法也暴露出不安全的方面,现在已建议改用 SHA-2。

六、随机数生成

随机数生成是许多加密操作不可分割的组成部分。例如,加密密钥需要尽可能地随机,以便使生成的密钥很难再现。加密随机数生成器所生成的输出必须满足以下条件:用优于二分之一的概率来预测从计算上而言是不可行的。因此,任何预测下一输出位的方法都不得优于随机猜测法。

参考网址: http://msdn.microsoft.com/zh-cn/library/92f9ye3s.aspx

 

Related posts:

  1. Python模块学习之hashlib
  2. jQuery plugin: Validation 表单校验
  3. 《Patterns for Sign Up &Ramp Up》下载

相关 [加密 服务学习 笔记] 推荐:

加密服务学习笔记

- - 标点符
公共网络(如 Internet)不提供实体间安全通信的方法. 这种网络上的通信容易被未经授权的第三方读取甚至修改. 加密有助于防止他人查看数据,它提供了检测数据是否已被修改的方式,同时有助于在非安全信道上提供安全的通信方式. 例如,可以使用加密算法对数据进行加密,在加密状态下传输数据,然后由预定的接收方对数据进行解密.

iOS 开发笔记-andriod/java/iOS三方AES通用加密 - jiangys

- - 博客园_首页
AES在线加解密验证工具:  http://www.seacha.com/tools/aes.html. AES加密有多种算法模式,下面提供两套模式的可用源码. 将数据进行Base64解码. 一、CBC(Cipher Block Chaining,加密块链)模式. 是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度..

笔记

- 毛毛 - 游戏人生
我关于写代码的一些琐碎的看法. 之前没有把 Paul Graham 的 <黑客与画家> 一书读完, 上周就从同事那里把书带回家, 也一直没读, 到这周才有时间读完. 很久没有更新了 (一看时间, 整整 5 个月), 顺便把这篇写了几个月的感想放出来.. 这本书前面 8 章讲述的内容, 大多是我并不太感兴趣的, 比如财富, 比如创业.

Textmate笔记

- Sean Lee - Reborn
过去在Windows上还真的没有怎么太在意文本编辑器(也跟自己不是职业程序员有点关系吧. ),近来常在Mac上使用Textmate,真觉得一款好的文本编辑器实在非常必要. Textmate售价$58,很多人觉得贵,不过它真的不错. 为Finder加上“Open in textmate”按钮. 作者Henrik的主页上有详细的介绍.

OSX 笔记

- - C++博客-首页原创精华区
在vbox中安装10.7的方法:. 首先使用OS_X_Lion.iso.torrent下载操作系统的iso文件. 直接使用OS_X_Lion.iso安装,安装完之后使用HJMac.iso进行启动. 在win7 64bit上通过,但是在linux上没有通过. 升级,可以把10.7升级为10.7.4,方法是去苹果官方 http://support.apple.com/downloads 网站下载:.

笔记--redis

- - 移动开发 - ITeye博客
接着准备面试内容,今天学习了下redis,继续我的笔记加深印象. 1.为什么要使用redis.  答:主要是 性能和 并发两个方面,另外redis也可以做分布式锁和消息队列等其他功能. 但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis.

云笔记:跨平台笔记服务

- one dollar - 天涯海阁-Web2.0Share
云笔记是一款跨平台的笔记服务,目前提供了Android、iPhone、iPad客户端(FIT写字板、FIT Paper). 最早知道云笔记也是因为一直使用FIT写字板,发现FIT写字板更新之后支持了云同步,才发现了云笔记. 云笔记是新点科技旗下的产品,相信Mac用户都会知道FIT输入法,Mac和iOS上面很棒的输入法应用.

小岛笔记 Day1

- Qian - 吃素菜,彼此相爱。
去巴厘岛之前,我们对旅行进行了明确分工,我负责研究攻略. 我特意买了09年版的孤独星球,像小学生一样注了注,贴了几溜彩色便签. 临行前,我被各种词条式的信息膨胀着,能在10秒内,标出7座海神庙9座指示方位神庙的地图方位. 状态好时,能说出哪家餐馆在哪页地图的横几格竖几格. 包哥最怕坐飞机,又贵看着又不安全的事儿,有悖他的人生信条.

笔记本爱经

- Yuheng Kuang - 煎蛋
oioi:sein已经回家过年 :|. 名为KamaSutra(爱经)Lap,看看你与笔记本最亲近的姿势会是怎样 :) link. 老实说大部分时间,这玩意并没有让我感觉舒服. © oioi for 煎蛋 / 20回复 / 投稿 / 图片托管于又拍网. geek:极客2011日历(图集). 数码看新鲜:Dell 旋转屏幕笔记本.

shell 学习笔记

- tiger - 游戏人生
将脚本目录加到 PATH 中. 在 dash 中如何进行字符串替换. 将 rst 格式文档转换为 blog 可用的 html 代码. shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本..