对称密码学、非对称密码学(Symmetric Algorithm, Asymmetric Algorithm)
对称密码只有一个密匙,加密和解密都使用这个相同的密匙。非对称密码有两个密匙,一个作为公匙可以告诉其他人,一个作为私匙只有自己知道,用公匙加密的数据只能用私匙解密,用私匙加密的数据只能用公匙解密。
使用对称密码,通讯双方都需要知道密匙,为了验证身份,发送方可能需要把密匙传递给接收方,这种方式可能带来一些潜在的安全性问题。非对称密码中,A用自己的私匙加密数据然后发送出去,其他人如果能够用A的公匙解密数据,那就能知道这个数据一定来自A--不可抵赖性,一般用户数字签名中;如果其他人需要向A发送数据,可以使用A的公匙加密数据,这样加密后的数据只有A才能解密--保密性,这个用于确保通讯的机密性。使用非对称密码通讯的双方各自拥有自己的一对公匙和私匙,向对方发送数据时,使用对方的公匙加密,让对方用私匙进行解密。
对称密码学的算法简便高效,密匙短,但很难破译,加密解密速度快。非对称密码一般较弱一些,为了防止被破译,使用的密匙长度会比较长,例如128位、512位等,加密解密运算所需时间会比较长。为了改善通讯过程中安全性应用带来的性能问题,一般的做法是发送方先使用一个对称密匙对消息加密,然后使用接收方的公匙加密这个对称密匙,一起发送给接收方。接收方先用自己的私匙解密出对称密匙,然后再用对称密匙解密消息数据。这样在传输的信息比较大时,带来的改善是明显的。在X.509一节中可以看到这一运用。
数字签名
数字签名是公共密匙体制的另一种应用。A需要向B发送一段报文,首先A使用特定的Hash算法对要发送的报文取得一个一定长度(例如128位等)的 Hash值,这个Hash值称为数字摘要(Digital Digest)。Hash算法尽量保证不同的报文产生的摘要不相同,即如果发送的报文在中途被攻击者修改了,新的摘要跟原来的摘要就不相同。然后A使用自己的私匙对摘要进行加密,加密后的值称为数字指纹、数字签名(Digital Signature),A把这个数字签名和要发送的报文一起发送给B。B接收到内容后,取出数字签名和报文,使用A的公匙对签名解密,就得到原文的数字摘要,然后B使用相同的Hash算法对报文获取摘要值,比较这两个摘要值是否一致。如果验证成功,B能够确定两件事情:1. 数据的确是A发送的;2. 数据在发送过程中没有被修改过。
常见窃取、攻击场景简单描述
应用系统最普通的方式是使用用户名、密码认证,如果使用明文方式向服务器发送认证信息,窃取者在路由上很容易截取到用户名、密码。
为了防止攻击者截获到明文的密码,最简单的方式是将密码加密后传送。但这样攻击者截获到加密过的密码,他虽然不知道密码的原文,但如果使用加密过的密码字符串,仍然可以通过服务器的验证,这也是重放攻击(Replay Attack)的一种形式。解决方法是客户端每次使用一个随机序列跟密码一起加密,这样每一次加密后的结果都不一样;客户端同时把这个随机序列和加密后的值发送给服务器,服务器用同样的方法用原密码和随机序列进行加密,比较加密的结果和客户端发来的加密结果是否一致。
这样做还没有解决问题,因为攻击者仍然可以截获消息中的加密结果和随机序列,用以通过服务器验证,还需要添加另外一个处理:过期策略。除了随机序列之外,客户端在添加一个创建时间,把密码(Password)、随机序列(Nonce)、创建时间(CreatedTime)这三个因素一起加密,例如加密值=Base64(SHA-1(Password+CreatedTime+Password)),同样,客户端把加密值、随机序列Nonce、创建时间CreatedTime一起传给服务器。在服务器上验证机制有所改变。首先,客户端每一次请求的Nonce都使用一个唯一标识,不会重复。服务器维护一个已经被处理过的Nonce缓存,每次接收到消息先检查这个Nonce是否在缓存中存在,如果已经存在,说明这个消息已经被处理过了,决绝这一次请求服务;如果不存在,则把这个Nonce添加到缓存,然后处理请求。为了避免缓存的Nonce值越来越多,因此使用一个CreatedTime,并确定一个过期时间,例如5分钟之后过期,这样,服务器只需要保存5分钟之内、还没有过期的Nonce值。在重放攻击中,对于那些已经过期的消息中的认证信息,服务器会拒绝处理。如果通过上面两项检查,则服务器使用相同的算法Base64(SHA-1(Password+CreatedTime+Password)) 来验证认证信息。通过这样的处理,确保认证信息每一次加密的结果都不一样,并且只能被有效的使用一次。
X.509
详细的规范可以从http://www.rfc.net/,查询X.509。
不清楚WSE 3.0中具体是如何使用X.509,但大致的数字签名步骤如下,应当相差不多:
1. A准备好要传送的信息(明文)。
2. A对数字信息进行Hash运算,得到一个数字摘要(Digital Digest)。
3. A用自己的私钥对数字摘要进行加密,得到数字签名(Digital Signature),并将其附在信息上。
4. A随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。
5. A用B的公钥对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给B。
6. B收到A传送过来的密文和加过密的DES密钥,先用自己的私钥对加密的DES密钥进行解密,得到DES密钥。
7. B用DES密钥对收到的密文进行解密,得到明文的信息。
8. B用A的公钥对A的数字签名进行解密,得到数字摘要。
9. B用同样的Hash算法对收到的明文进行Hash运算,得到一个新的数字摘要。
10. B将解密的数字摘要和自己运算的数字摘要进行验证是否一致。
对称密码学使用相同的密匙加密和解密消息,因此客户端和服务器端都存在密码保存问题,验证过程中存在密码信息直接或间接的传送,给这种机制带来一些不安全因素。正由于这样的因素,非对称密码学,尤其是X.509,目前被普遍运用在Internet的电子商务中。
Kerberos
RFC标准中Kerberos工作步骤如下:
![](https://images.cnblogs.com/cnblogs_com/riccc/webservice_kerberos.gif)
1. Kerberos authentication service request (KRB_AS_REQ)
用户输入用户名、用户口令登录工作站机器,工作站向KDC(Key Distribution Center)的AS(Authentication Service认证服务)发送认证信息。认证信息只包含用户帐号,不包含用户口令。
2. Kerberos authentication service response (KRB_AS_REP)
AS为后面工作站与TGS(Ticket Granting Service票据授权服务)之间的通讯创建Session Key(会话口令)SK1,将客户端信息、TGS服务信息、SK1、时间戳、有效期等信息使用TGS的口令加密,生成TGT(Ticket Granting Ticket票据授权票)。同时KDC在用户帐号数据库中查询用户口令,将TGS服务信息、SK1使用用户口令加密打包。最后AS把加密包和TGT发送给工作站。
工作站接收到返回信息之后,使用用户登录时输入的用户口令对加密包解密,如果能成功解密,则表示通过了KDC的身份认证,并得到TGS服务信息和SK1,并且拥有了TGT。
第一点,用户口令只有用户与KDC知道,工作站向KDC认证的过程中并不将用户口令发送给KDC的AS,而是通过让工作站自己解密的方式来证明自己。如果工作站无法解密,它将无法与TGS通讯,从而无法使用其它应用服务和资源等。
第二点,AS给工作站颁发TGT,后面工作站将使用TGT向TGS请求其它应用服务,而无需再进行用户名、用户口令的验证,实现SSO。
第三点,TGS拥有自己的口令,这个口令只有TGS和AS知道,因此工作站虽然拿到TGT,因为是使用TGS的口令加密,其他人包括工作站并不能解密和篡改TGT中内容,它只需要在向TGS申请其它应用服务时发送这个TGT。
第四点,AS为工作站后面与TGS的通讯生成一个Session Key SK1,这个SK1在工作站与TGS之间共享,使得后面TGS与工作站通讯时,TGS能够对工作站这个客户端进行认证。上面已经看到工作站如何得到SK1,而AS并没有直接告诉TGS这个SK1,下面的步骤中你可以看到TGS如何得到SK1。
3. Kerberos ticket-granting service request (KRB_TGS_REQ)
工作站上的用户请求其它应用系统服务,例如邮件服务时,邮件客户端首先查询工作站上是否已经拥有邮件服务的Service Ticket(服务票据),如果没有则向TGS申请这个Service Ticket。
申请Service Ticket过程如下。工作站将客户端信息、要申请的服务信息(邮件服务)使用SK1加密生成一个验证器,与TGT一起发送给TGS。
TGS接收到工作站的请求后,使用TGS的口令对TGT解密,得到TGT中的内容。首先根据时间戳、有效期信息检查是否过期,如果没有过期,则使用SK1解密验证器,比较验证器中的客户端信息与TGT中的客户端信息是否一致。如果一致则表示这个请求通过了TGS的认证。
4. Kerberos ticket-granting service response (KRB_TGS_REP)
从验证器的解密内容中,TGS知道工作站是在申请邮件服务的Service Ticket。同样,TGS为工作站与邮件服务之间的通讯创建一个Session Key SK2,将客户端信息、邮件服务信息、SK2、时间戳、有效期等信息使用邮件服务的口令加密,生成邮件服务的Service Ticket。TGS将SK2使用SK1加密,把这个加密包和Service Ticket一起发送给工作站。
第一点,从上面3、4步骤中可以看出,TGS如何获得AS为它和工作站之间建立的会话口令SK1,并使用这个SK1对工作站的请求进行验证。同样的方式,TGS为工作站与邮件服务之间的通讯也创建一个会话口令SK2。
第二点,邮件服务拥有自己的口令,只有TGS与邮件服务自己知道。邮件服务的Service Ticket使用邮件服务口令加密,其他人包括工作站无法解密,只有邮件服务自己可以解开。
5. Kerberos application server request (KRB_AP_REQ)
接下来工作站得到TGS的响应消息,它得到了邮件服务的Service Ticket和一个加密包。工作站是使用SK1解开加密包,得到它与邮件服务器之间通讯的会话口令SK2。
然后工作站将客户端信息使用SK2加密,生成验证器,将验证器和邮件服务的Service Ticket一起发送给邮件服务器,请求邮件服务。
邮件服务接收到工作站的请求后,使用邮件服务口令解密Service Ticket,得到里面的内容。首先查看Service Ticket中的邮件服务信息,确认是否是在向自己请求服务。然后根据时间戳、有效期检查是否过期。如果没有过期,则使用SK2解密验证器,比较验证器中的客户端信息与Service Ticket中的客户端信息是否一致。如果上面的验证全部通过,则这个请求通过了邮件服务器的认证。
6. Kerberos application server response (optional) (KRB_AP_REP)
在RFC标准中,这一个步骤是可选的。应用服务处理完请求之后,如果需要向工作站发送信息,则将这些信息发送回工作站。
最后需要说明的是,在Kerberos V5中,为防止Replay Attack(重放攻击),上面对验证器的处理说得并不详细。首先采用一些处理使得每次验证器不一样。验证器本身有一个有效期,大概5分钟的样子。服务器上将建立一个验证器缓存,确保一个验证器在有效期之内只能被使用一次。
另外,RFC标准中KDC的AS和TGS可以是在一起,也可以是分开在不同的Server上。
通过上面的过程可以看出,Kerberos使用对称密码,而对称密码算法高效,密匙短但难以被破译,如果再采取一些其它措施,例如Strong Password(强密码)、密码有效期控制等,不考虑被集成的应用等其它因素,这种机制本身非常严密,机密性比较高。针对Kerberos机制的一些攻防场景,参考设计一个认证系统,这里有中文版本,不少地方翻译的不够准确。微软基于域环境实现Kerberos,详细的资料可以参考微软官方网站,例如,Kerberos Authentication Explained;How the Kerberos Version 5 Authentication Protocol Works。
由于实现Kerberos的机制、被集成的应用等各种原因,使得目前Kerberos只能在一个内网中使用,例如微软的域环境下。
对称密码只有一个密匙,加密和解密都使用这个相同的密匙。非对称密码有两个密匙,一个作为公匙可以告诉其他人,一个作为私匙只有自己知道,用公匙加密的数据只能用私匙解密,用私匙加密的数据只能用公匙解密。
使用对称密码,通讯双方都需要知道密匙,为了验证身份,发送方可能需要把密匙传递给接收方,这种方式可能带来一些潜在的安全性问题。非对称密码中,A用自己的私匙加密数据然后发送出去,其他人如果能够用A的公匙解密数据,那就能知道这个数据一定来自A--不可抵赖性,一般用户数字签名中;如果其他人需要向A发送数据,可以使用A的公匙加密数据,这样加密后的数据只有A才能解密--保密性,这个用于确保通讯的机密性。使用非对称密码通讯的双方各自拥有自己的一对公匙和私匙,向对方发送数据时,使用对方的公匙加密,让对方用私匙进行解密。
对称密码学的算法简便高效,密匙短,但很难破译,加密解密速度快。非对称密码一般较弱一些,为了防止被破译,使用的密匙长度会比较长,例如128位、512位等,加密解密运算所需时间会比较长。为了改善通讯过程中安全性应用带来的性能问题,一般的做法是发送方先使用一个对称密匙对消息加密,然后使用接收方的公匙加密这个对称密匙,一起发送给接收方。接收方先用自己的私匙解密出对称密匙,然后再用对称密匙解密消息数据。这样在传输的信息比较大时,带来的改善是明显的。在X.509一节中可以看到这一运用。
数字签名
数字签名是公共密匙体制的另一种应用。A需要向B发送一段报文,首先A使用特定的Hash算法对要发送的报文取得一个一定长度(例如128位等)的 Hash值,这个Hash值称为数字摘要(Digital Digest)。Hash算法尽量保证不同的报文产生的摘要不相同,即如果发送的报文在中途被攻击者修改了,新的摘要跟原来的摘要就不相同。然后A使用自己的私匙对摘要进行加密,加密后的值称为数字指纹、数字签名(Digital Signature),A把这个数字签名和要发送的报文一起发送给B。B接收到内容后,取出数字签名和报文,使用A的公匙对签名解密,就得到原文的数字摘要,然后B使用相同的Hash算法对报文获取摘要值,比较这两个摘要值是否一致。如果验证成功,B能够确定两件事情:1. 数据的确是A发送的;2. 数据在发送过程中没有被修改过。
常见窃取、攻击场景简单描述
应用系统最普通的方式是使用用户名、密码认证,如果使用明文方式向服务器发送认证信息,窃取者在路由上很容易截取到用户名、密码。
为了防止攻击者截获到明文的密码,最简单的方式是将密码加密后传送。但这样攻击者截获到加密过的密码,他虽然不知道密码的原文,但如果使用加密过的密码字符串,仍然可以通过服务器的验证,这也是重放攻击(Replay Attack)的一种形式。解决方法是客户端每次使用一个随机序列跟密码一起加密,这样每一次加密后的结果都不一样;客户端同时把这个随机序列和加密后的值发送给服务器,服务器用同样的方法用原密码和随机序列进行加密,比较加密的结果和客户端发来的加密结果是否一致。
这样做还没有解决问题,因为攻击者仍然可以截获消息中的加密结果和随机序列,用以通过服务器验证,还需要添加另外一个处理:过期策略。除了随机序列之外,客户端在添加一个创建时间,把密码(Password)、随机序列(Nonce)、创建时间(CreatedTime)这三个因素一起加密,例如加密值=Base64(SHA-1(Password+CreatedTime+Password)),同样,客户端把加密值、随机序列Nonce、创建时间CreatedTime一起传给服务器。在服务器上验证机制有所改变。首先,客户端每一次请求的Nonce都使用一个唯一标识,不会重复。服务器维护一个已经被处理过的Nonce缓存,每次接收到消息先检查这个Nonce是否在缓存中存在,如果已经存在,说明这个消息已经被处理过了,决绝这一次请求服务;如果不存在,则把这个Nonce添加到缓存,然后处理请求。为了避免缓存的Nonce值越来越多,因此使用一个CreatedTime,并确定一个过期时间,例如5分钟之后过期,这样,服务器只需要保存5分钟之内、还没有过期的Nonce值。在重放攻击中,对于那些已经过期的消息中的认证信息,服务器会拒绝处理。如果通过上面两项检查,则服务器使用相同的算法Base64(SHA-1(Password+CreatedTime+Password)) 来验证认证信息。通过这样的处理,确保认证信息每一次加密的结果都不一样,并且只能被有效的使用一次。
X.509
详细的规范可以从http://www.rfc.net/,查询X.509。
不清楚WSE 3.0中具体是如何使用X.509,但大致的数字签名步骤如下,应当相差不多:
1. A准备好要传送的信息(明文)。
2. A对数字信息进行Hash运算,得到一个数字摘要(Digital Digest)。
3. A用自己的私钥对数字摘要进行加密,得到数字签名(Digital Signature),并将其附在信息上。
4. A随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。
5. A用B的公钥对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给B。
6. B收到A传送过来的密文和加过密的DES密钥,先用自己的私钥对加密的DES密钥进行解密,得到DES密钥。
7. B用DES密钥对收到的密文进行解密,得到明文的信息。
8. B用A的公钥对A的数字签名进行解密,得到数字摘要。
9. B用同样的Hash算法对收到的明文进行Hash运算,得到一个新的数字摘要。
10. B将解密的数字摘要和自己运算的数字摘要进行验证是否一致。
对称密码学使用相同的密匙加密和解密消息,因此客户端和服务器端都存在密码保存问题,验证过程中存在密码信息直接或间接的传送,给这种机制带来一些不安全因素。正由于这样的因素,非对称密码学,尤其是X.509,目前被普遍运用在Internet的电子商务中。
Kerberos
RFC标准中Kerberos工作步骤如下:
![](https://images.cnblogs.com/cnblogs_com/riccc/webservice_kerberos.gif)
1. Kerberos authentication service request (KRB_AS_REQ)
用户输入用户名、用户口令登录工作站机器,工作站向KDC(Key Distribution Center)的AS(Authentication Service认证服务)发送认证信息。认证信息只包含用户帐号,不包含用户口令。
2. Kerberos authentication service response (KRB_AS_REP)
AS为后面工作站与TGS(Ticket Granting Service票据授权服务)之间的通讯创建Session Key(会话口令)SK1,将客户端信息、TGS服务信息、SK1、时间戳、有效期等信息使用TGS的口令加密,生成TGT(Ticket Granting Ticket票据授权票)。同时KDC在用户帐号数据库中查询用户口令,将TGS服务信息、SK1使用用户口令加密打包。最后AS把加密包和TGT发送给工作站。
工作站接收到返回信息之后,使用用户登录时输入的用户口令对加密包解密,如果能成功解密,则表示通过了KDC的身份认证,并得到TGS服务信息和SK1,并且拥有了TGT。
第一点,用户口令只有用户与KDC知道,工作站向KDC认证的过程中并不将用户口令发送给KDC的AS,而是通过让工作站自己解密的方式来证明自己。如果工作站无法解密,它将无法与TGS通讯,从而无法使用其它应用服务和资源等。
第二点,AS给工作站颁发TGT,后面工作站将使用TGT向TGS请求其它应用服务,而无需再进行用户名、用户口令的验证,实现SSO。
第三点,TGS拥有自己的口令,这个口令只有TGS和AS知道,因此工作站虽然拿到TGT,因为是使用TGS的口令加密,其他人包括工作站并不能解密和篡改TGT中内容,它只需要在向TGS申请其它应用服务时发送这个TGT。
第四点,AS为工作站后面与TGS的通讯生成一个Session Key SK1,这个SK1在工作站与TGS之间共享,使得后面TGS与工作站通讯时,TGS能够对工作站这个客户端进行认证。上面已经看到工作站如何得到SK1,而AS并没有直接告诉TGS这个SK1,下面的步骤中你可以看到TGS如何得到SK1。
3. Kerberos ticket-granting service request (KRB_TGS_REQ)
工作站上的用户请求其它应用系统服务,例如邮件服务时,邮件客户端首先查询工作站上是否已经拥有邮件服务的Service Ticket(服务票据),如果没有则向TGS申请这个Service Ticket。
申请Service Ticket过程如下。工作站将客户端信息、要申请的服务信息(邮件服务)使用SK1加密生成一个验证器,与TGT一起发送给TGS。
TGS接收到工作站的请求后,使用TGS的口令对TGT解密,得到TGT中的内容。首先根据时间戳、有效期信息检查是否过期,如果没有过期,则使用SK1解密验证器,比较验证器中的客户端信息与TGT中的客户端信息是否一致。如果一致则表示这个请求通过了TGS的认证。
4. Kerberos ticket-granting service response (KRB_TGS_REP)
从验证器的解密内容中,TGS知道工作站是在申请邮件服务的Service Ticket。同样,TGS为工作站与邮件服务之间的通讯创建一个Session Key SK2,将客户端信息、邮件服务信息、SK2、时间戳、有效期等信息使用邮件服务的口令加密,生成邮件服务的Service Ticket。TGS将SK2使用SK1加密,把这个加密包和Service Ticket一起发送给工作站。
第一点,从上面3、4步骤中可以看出,TGS如何获得AS为它和工作站之间建立的会话口令SK1,并使用这个SK1对工作站的请求进行验证。同样的方式,TGS为工作站与邮件服务之间的通讯也创建一个会话口令SK2。
第二点,邮件服务拥有自己的口令,只有TGS与邮件服务自己知道。邮件服务的Service Ticket使用邮件服务口令加密,其他人包括工作站无法解密,只有邮件服务自己可以解开。
5. Kerberos application server request (KRB_AP_REQ)
接下来工作站得到TGS的响应消息,它得到了邮件服务的Service Ticket和一个加密包。工作站是使用SK1解开加密包,得到它与邮件服务器之间通讯的会话口令SK2。
然后工作站将客户端信息使用SK2加密,生成验证器,将验证器和邮件服务的Service Ticket一起发送给邮件服务器,请求邮件服务。
邮件服务接收到工作站的请求后,使用邮件服务口令解密Service Ticket,得到里面的内容。首先查看Service Ticket中的邮件服务信息,确认是否是在向自己请求服务。然后根据时间戳、有效期检查是否过期。如果没有过期,则使用SK2解密验证器,比较验证器中的客户端信息与Service Ticket中的客户端信息是否一致。如果上面的验证全部通过,则这个请求通过了邮件服务器的认证。
6. Kerberos application server response (optional) (KRB_AP_REP)
在RFC标准中,这一个步骤是可选的。应用服务处理完请求之后,如果需要向工作站发送信息,则将这些信息发送回工作站。
最后需要说明的是,在Kerberos V5中,为防止Replay Attack(重放攻击),上面对验证器的处理说得并不详细。首先采用一些处理使得每次验证器不一样。验证器本身有一个有效期,大概5分钟的样子。服务器上将建立一个验证器缓存,确保一个验证器在有效期之内只能被使用一次。
另外,RFC标准中KDC的AS和TGS可以是在一起,也可以是分开在不同的Server上。
通过上面的过程可以看出,Kerberos使用对称密码,而对称密码算法高效,密匙短但难以被破译,如果再采取一些其它措施,例如Strong Password(强密码)、密码有效期控制等,不考虑被集成的应用等其它因素,这种机制本身非常严密,机密性比较高。针对Kerberos机制的一些攻防场景,参考设计一个认证系统,这里有中文版本,不少地方翻译的不够准确。微软基于域环境实现Kerberos,详细的资料可以参考微软官方网站,例如,Kerberos Authentication Explained;How the Kerberos Version 5 Authentication Protocol Works。
由于实现Kerberos的机制、被集成的应用等各种原因,使得目前Kerberos只能在一个内网中使用,例如微软的域环境下。