安全的基础知识 在高度保证企业应用程序安全的过程中我们不免会考虑到如下的安全需求,然后我们针对这些安全需求提出各种安全技术: 1、完整性验证(Integrity Verification)。也就是以防止我们需要的内容不被篡改。 2、机密性保持(Confidentiality Preservation)。通俗的说就是防止内容被别人读懂。 3、认证和访问授权(Authenticity Permission)。通俗的说就是对来访者提供的信息进行分析和判断,从而确定来访者身份,然后根据身份决定该来访者具有什么权限。 4、不可抵赖的证据(Nonrepudiation Evidence)。举个很简单的例子,如果你去银行交费,银行必须该你一个交过费的凭证,不然被别人私通怎么办? 5、审计证据(Auditing Evidence)。对一些安全性十分重要的数据操作进行纪录和观察,相当于银行的那个摄像头,在需要的时候他们的作用你就知道。 加密技术(包括防止篡改技术) 加密技术是其它安全服务技术的基础,其他安全穿插使用相当广泛。所以在学习软件安全技术之前了解各种加密技术是相当重要的。 加密技术的分类 1、消息摘要 消息摘要主要用于保持数据的完整性,我们经常听到的校验和就是消息摘要的一个特例。它的算法是一个单项函数。也就是直接将输入的数据进行消息摘要提取,但绝不能从消息摘要生成原数据。消息摘要的算法分为如下几类(最常用的是MD5和SHA-1): MD2:是一个速度很慢但相当安全的算法,它产生128位的摘要值。 MD4:速度很快,但安全性下降。同样产生128位的摘要值。 MD5:是MD4的一个更安全的版本,同时速度更快。也产生128位的摘要值。 SHA:安全哈希算法,产生一个160位的摘要值。 SHA-1:在克服SHA的一些缺陷基础上形成的哈希算法。 SHA-256、SHA-383 和 SHA-512 提供更长的指纹,大小分别是 256 位、383 位和 512 位。 MAC:消息认证码,使用秘密密钥和消息摘要算法来创建消息摘要。 我们可能经常会疑问,我们有了消息摘要为什么还要认证码呢?听我给你举个例子,前面提到的消息摘要的算法可以确保消息摘要和具体的消息之间的一一对应,也就是只要你有相同的消息,采用相同的算法肯定能产生相同的消息摘要,但有时为了特殊的目的我们需要只有特定的人才能生成这个摘要,这时候我们可以通过在生成消息摘要的过程中加入相应的密钥,从而使生成的消息摘要在没有密钥的情况下难以生成。 鉴于消息摘要的一一对应,经常在一些保护用户密码的地方我们采用了这种算法。例如,在银行系统,为了不让管理数据库的员工把你的密码看到,系统本身在你的密码存入库中之前就做了消息摘要的提取,这样库中别人看到的是一串奇怪的串,他也没法逆向获得你的明文密码。当然,如果银行的安全系统被控制,那什么事情都可以做。 2、对称密钥(私钥加密) 对称密钥应该是相当强壮的信息加密算法。这和我们生活中的钥匙极为相像。例如你家的门锁可以有好几把钥匙,并且这些钥匙都相同。在现实生活中,你可以将做好的钥匙手递手交给你的亲人,指要有了钥匙,你就可以打开你家的门。 我们经常登陆网站用的用户名和密码的原理就是这样的。但密码等在网络传输中很容易被窃听和截取,为了确保传输安全我们必须和后面提到的传输相关的加密算法配合进行,例如我们在登陆时使用https。下面是一些最普通的对称密钥算法: DES:DES(数据加密标准)是由IBM于上世纪70年代发明的,美国政府将其采纳为标准,使用56位的密钥。 3-DES(TripleDES):该算法被用来解决使用DES技术的56位时密钥日益减弱的强度,其方法是:使用两个密钥对明文运行DES算法三次,从而得到112位有效密钥强度。TripleDES 有时称为DESede(表示加密、解密和加密这三个阶段)。 RC2和RC4:可以使用2048位的密钥并且提供了一个十分安全的算法。他们都来自于领先的加密安全性公司 RSA Security。 RC5:使用了一种可配置的密钥大小。也来自领先的加密安全性公司 RSA Security。 AES:AES(高级加密标准)取代 DES 成为美国标准。它是由 Joan Daemen 和 Vincent Rijmen 发明的,也被称为 Rinjdael 算法。它是 128 位分组密码,密钥长度为 128 位、192 位或 256 位。 Blowfish:这种算法是由 Bruce Schneier 开发的,它是一种具有从 32 位到 448 位(都是 8 的整数倍)可变密钥长度的分组密码,被设计用于在软件中有效实现微处理器。 PBE。PBE(基于密码的加密)可以与多种消息摘要和私钥算法结合使用。 3、非对称密钥(公共密钥) 我们在介绍对称密钥的时候举了一个例子,提到了密钥传输的安全问题。并且在网络中的传输双方并不是我们现实中的亲人关系,为了达到双方的信任和安全,我们需要寻找一种机制,那么公钥正好解决了这个问题。我这里举个通俗的例子,例如你有个信箱(物理信箱),开着一个缝隙(公钥),大家都能往里塞东西,但是一旦塞进取,那可不是大家都能取到的,只有拥有信箱钥匙(私钥)才能得到。 公钥就这样,不要担心它多难理解。当然当我们反过来理解的时候就有些和信箱不同的地方。也就是用私钥加密的东西只有对应的公钥才能进行解密,这种算法经常被应用在数字签名上。其实在现实中你可以将公钥技术和私钥技术结合起来完成信息保密,因为公钥的计算速度相当慢,比私钥慢大约100-1000倍。下面是一些非对称密钥算法列表: RSA:这个算法是最流行的公钥密码算法,使用长度可以变化的密钥。 Diffie-Hellman:技术上将这种算法称为密钥协定算法。它不能用于加密,但可以用来允许双方通过在公用通道上共享信息来派生出秘钥。然后这个密钥可以用于私钥加密。 需要注意的是私钥和密钥是成对的,并且不能用一个生成另外一个,特别是不能用公钥生成私钥,否则就麻烦了。 认证和不可抵赖 我们经常在论坛中中见到管理员、斑竹等身份标识,并且我们更明白拥有不同的身份它们的权限也同样有差别。但我们很想拥有管理员的权限,我们的突破口应该在哪里呢?当然是获得一个管理员的账号,这样就可以被系统的认证系统识别。 通俗的说就是要让系统的认证识别器确认你是管理员身份就可以了。呵呵,没那么容易,因为各个系统都具有严密的认证体系,不象一些小朋友做的认证逻辑处在sql溢出逻辑上那么简单。 认证的实现方法多种多样,真的,我以前做网站的时候总是想当然地进行用户认证。但其基础技术有如下几种: 基于口令的身份认证,常见的用户密码方式 基于令牌的物理标识和认证 基于生物测定学的认证 基于证书的认证 下面就分别将这些认证做一介绍: 基于口令的身份认证 太熟悉了,不是吗?这里只很想告诉口令暴露的过程以及保护的过程。我们通常见到的口令认证方式是在传输过程中口令完全暴露,并且在服务器端的口令存储上也完全是明文的形式,造成的后果是口令完全被暴露,很容易被监听或者在数据库里读取。那么如何保护这些过程中的口令呢?暂时的思路是:建立在安全传输层的基础上,内部口令不以明文形式出现。 基于令牌的物理标识和认证 功能我们不用说,当然是非常强大,但代价昂贵。 基于生物测定学的认证 基于证书的认证 近年来相当流行的认证技术是基于证书的认证。证书的概念和我们现实中的毕业证书、学位证书等差不多。上面可以记载一些事实信息(特别是某一实体),那当然差别主要体现在数字技术的特殊需要上。其实证书就是一个数据块,主要包括公开密钥、主体相关的信息、证书有效的日期、证书发行者的信息和证书发行者生成的签名。 不是亲人那我们就得搞清楚对方是什么?不然的话,我们怎么能把她的东西拿来用呢?或者怎么能把咱们的东西给她呢?她得拿出个什么凭据吧?那当然。这无可非议,可能现在你更急切的就是想知道这个证书的签发和应用过程吧? 我们前面已经谈过将公钥技术反过来可以应用于数字签名。但数字签名谁都可以做,数字签名仅仅能解决你是谁,但并不能说明该主人就是一个多么可爱和友好的家伙。 其实整个过程很简单,就认为是二次数字签名就是了。第一次首先需要证书的实体将自己的信息和公钥提交给CA,CA确认该组织的可信赖之后,就用自己的密钥对该实体的信息和公钥进行签名。 最后被签名的信息就叫证书(当然没有CA担保签名的证书也是证书,但那只是自己给自己发)。站在用户的角度,用户首先接到一个证书,当然会根据CA(可信)提供的公钥进行解密,如果能解密,当然就可以获得可信赖的信息和实体公钥,但前提是你已经有你信赖的CA的公钥,你如果是windows你可以直接升级你的证书公钥库。然后由实体公钥再进行前面我们介绍的数字签名解密步骤。 安全套接字层 安全套接字层(SSL)和取代它的传输层安全性(TLS)是用于在客户机和服务器之间构建安全的通信通道的协议。它也用来客户机认证服务器(不太常用的),当经常用来服务器认证客户机。该协议在浏览器应用程序中比较常见,当浏览https://...时,浏览器窗口底部的锁表明 SSL/TLS 有效。TLS 1.0 和 SSL 3.1 一样。 SSL/TLS 使用本教程中已经讨论过的三种密码术构件的混合体,但这一切都是对用户透明的(也就是系统帮你做了所有)。以下是该协议的简化版本: 当使用 SSL/TLS(通常使用 https:// URL)向站点进行请求时,从服务器向客户机发送一个证书。客户机使用已安装的公共 CA 证书通过这个证书验证服务器的身份,然后检查 IP 名称(机器名)与客户机连接的机器是否匹配。 客户机生成一些可以用来生成对话的私钥(称为会话密钥)的随机信息,然后用服务器的公钥对它加密并将它发送到服务器。服务器用自己的私钥解密消息,然后用该随机信息派生出和客户机一样的私有会话密钥。通常在这个阶段使用 RSA 公钥算法。 然后,客户机和服务器使用私有会话密钥和私钥算法(通常是 RC4)进行通信。使用另一个密钥的消息认证码来确保消息的完整性。 |