热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(转)WSE3.0安全性方面整理

对称密码学、非对称密码学(SymmetricAlgorithm,AsymmetricAlgorithm)对称密码只有一个密匙,加密和解密都
对称密码学、非对称密码学(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工作步骤如下:

    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只能在一个内网中使用,例如微软的域环境下。



推荐阅读
  • 现在很多App在与服务器接口的请求和响应过程中,为了安全都会涉及到加密和解密的问题,如果不加的话就会是明文的,即使加了GZIP也可以被直接解压成明文。如果同时有Android和IO ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • 技术分享:如何在没有公钥的情况下实现JWT密钥滥用
      ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 一、前言个人认为,PHP是世界上为数不多,最人性化的语言。虽然是二次开发、弱类型语言,由CC编写的PHP引擎去解析。但是,其 ... [详细]
author-avatar
lovejiao2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有