一种在电视制播网中实现多webservice安全单点登录的机制广播电视规划院崔俊生邓向冬张健东李厦摘要:本文首先描述了当前电视制播网络中webservice服务认证存在的问题,针对此问题提出了一种安全实现单点登录的统一认证机制。关键词:webservice、安全、单点登录、统一认证1.背景由于电视台的制播网络越来越庞大复杂,目前一个完整的广播电视制播网络一般由多个厂家共同承建,其中每一个厂家负责承建制播网络中的一个或者多个子系统,这些子系统多数通过webservice接口对外提供服务。目前webservice服务的认证一般是基于http协议,而基于http协议的认证只能实现单个webservice服务的认证,即每个webservice服务需要保存一份其授权用户的用户名、用户密码、用户权限等信息。如果客户程序(如非编程序),需要访问不同子系统的中的webservice服务,如果使用基于http协议认证,可以通过以下两种认证方案:1.每一个webservice服务单独管理自己的用户名密码。但是,用户在使用非编程序时,需要根据访问的不同webservice服务输入不同用户名密码,给用户造成了严重的不便。2.所有的webservice服务共同维护一个用户名密码列表。这样同一份用户名密码列表需要部署在不同厂家、不同管理员管理的子系统,这会带来严重安全问题和管理问题。同时以上两种认证方案,也给系统管理员带来不变,系统管理员对每一个的webservice需要维护一份用户授权数据,随着系统内webservice服务增多,系统管理的工作量随之增加,如:每增加或者删除一个用户,需要在每一个webservice服务进行相应的操作。我们需要一种解决方案,该方案可以实现以下功能:用户在访问多个webservice服务时,只需要提供一个用户名密码;系统管理员只需在一个单独的认证服务器上维护一份用户、密码及用户授权数据便可管理系统中所有的用户和webservice服务。这就是典型的单点登录需求。笔者在进行一些制播网络验收测试时,发现一些制播网集成软件服务的提供厂家通过webservice的soap消息实现了以上单点登录的需求。具体实现如下图所示:Webservice服务客户1234图1基于soap消息传输实现webservice单点登录机制认证服务5第一个消息是客户通过发送认证的soap请求消息进行登录认证,该消息包含有未加密的用户、密码;第二个消息是认证服务器通过查询LDAP用户数据库,检查用户名、密码是否正确,如果正确,返回一个soap消息,该消息中包含一个由字母和数字组成token字符串;客户收到此token后在本地保存此token,保存时间为此次登录会话时间。第三个消息是客户发送包含这个token的soap消息去相应的服务器去请求服务;第四个消息是Webservice服务去认证服务器验证此token是否是该认证服务器生成的消息;第五个消息是认证服务返回此token是否合法的相应消息,如果是合法的token(即该认证服务器生成了此token,且在有效期内),则Webservice服务相应服务请求。此机制基本实现了单点登录的需求,但是存在以下几个问题:1.用户名、密码是明码传输,很容易在传输环节被获取,而且系统本身有消息的日志功能;有系统维护权限的人员可以通过消息日志轻易获得其他人的用户名和密码。2.token没有时间标记,没有防御重放攻击的能力。因此,该方案虽然实现了多webservice服务的单点登录,但是存在严重的安全问题。在电视台的制播网络中,需要一个可以实现安全的、用于多webservice服务认证的单点登录方案。本文描述了一种可以实现单点登录的安全认证方案。2.方案基本原理本认证机制的基本原理是基于第三方信任的机制,为了便于理解拟人化说明如下,其中甲相当于认证服务设备,乙相当于访问业务的用户和客户程序,丙相当于webservice服务器:(1)甲、乙、丙三人,乙信任甲,且乙与甲共享一个其他人所不知的密钥,使用该密钥封装的信息,除甲乙二人可以打开看到真实内容外,甲乙二人以外任何人不能看到该真实内容,除非有人知道甲、乙二人共享的密钥;同样丙信任甲,且丙与甲共享一个其他人所不知的密钥,该密钥封装信息的内容也只有丙与甲才可以看到其真实的内容;甲可以控制乙对丙的访问权限;(2)乙向丙请求服务前,乙告诉甲“我要向丙请求服务”;(3)甲用甲、乙共享的密钥封装一个信息返回给乙,该信息包括:(a)用甲、丙共享密钥封装的信息,该信息包括内容有乙的身份信息、乙请求丙服务内容的信息、暂时分配一个乙与丙共享的会话密钥、该共享会话密钥的过期时间等;(b)乙请求丙服务内容的信息、暂时分配一个乙与丙共享的会话密钥、该共享密钥的过期时间;(4)乙用甲、乙共享的密钥读取信息中内容,并且把以下信息发送给丙:(a)乙从信息中读取的甲用甲与丙共享密钥封装的信息;(b)不封装的乙的名称、当前时间、请求的服务;(c)用甲分配的由乙与丙共享的会话密钥封装的信息,信息内的信息有当前时间等;(5)丙用甲与丙共享的密钥读取通过乙转述的信息内容,得到乙与丙的暂时共享会话密钥及过期时间,还是有乙请求的业务、乙的名字、乙请求的服务;(6)丙用乙与丙的暂时共享密钥得到乙请求时的当前时间,丙通过比较不封装的乙的名称、当前时间、请求的服务与封装乙的名称、当前时间、请求的服务是否相同,来判断发送该消息的“乙”是否是真正的乙,而且是经过甲授权的乙。3.方案具体实现3.1.角色定义与认证流程3.1.1.方案角色定义为了便于理解,把本认证机制中角色定义如下:用户:使用系统某一个功能的自然人或者一个程序,每一个用户都有一个用户名和登录口令,此用户名和登录口令需在认证服务器经过认证;客户:是服务的客户端,用户通过客户端访问系统服务,用户在访问系统服务前,需要输入用户名和登录口令进行认证。服务:提供服务的已经运行的程序。认证服务:提供第三方信任的认证程序。3.1.2.认证流程系统中用户去认证服务器进行注册,注册内容必须包括用户名和登录口令这两个基本要素,认证流程如图1所示。同时对网络系统中每一个服务也要分配用户名和登录口令,并进行注册。在认证服务器上可以配置用户对各个服务的访问权限。这样针对每一个合法用户或者服务,在认证服务器上都有一个用户名和登录口令,这个用户名和登录口令只有认证服务器和用户本身知道,其他用户和服务不能获得。在注册完成后,就可以进行统一认证服务。认证流程图见“图2服务请求认证流程”,具体流程为:服务认证服务用户图1注册流程认证服务服务客户123图2服务请求认证流程用户41)用户进入客户程序时输入用户的名称和口令;2)客户程序把用户名称和可能申请的服务以及申请服务的过期时间等信息生成“认证请求消息”,并发送给认证服务;3)认证服务查找用户是否存在,如果存在,读取用户口令,用散列获得的用户口令作为密钥加密以下信息,生成“认证请求相应消息”并返回给客户程序:a)客户认证信息;b)检查用户是否具有其所请求服务的权限,如果具有权限,用被请求服务的口令散列后的密钥加密请求信息;4)客户程序使用用户输入的口令,散列生成解密密钥解密“认证请求相应消息”,确认用户输入的口令是否正确,并且得到服务请求响应信息,根据响应信息有无可以判断用户对该服务是否具有访问权限。5)当用户需要访问服务时,生成“服务请求认证消息”,发送给服务程序,服务程序通过散列本身的口令生成的密码解密“服务请求认证消息”,从而判断请求是否有效。3.2.认证流程的半形式化表达为了便于各个认证机制中由不同厂家开发的角色的互联互通,本节对认证流程中各个消息的使用严谨的形式化表达。在本认证机制中下列符号定义如下:mH:对数据m取SHA1散列,返回SHA1摘要值;)(mCk:使用密钥k加密数据m,加密算法为AES128,采用ECB方式加密,如果m不能被16整除,使用空格补齐;返回加密后的密文;)(mDk:使用密钥k解密数据m,解密算法为AES128,m的加密方式采用ECB,解密后去掉明文末尾空格并返回;UP:用户的登录口令,UserPassword;SP:服务的登录口令,ServicePassword;Sid:会话ID(SESSION_ID),8个字节的数字和字母的组合;SK:会话密钥(SESSION_KEY)UN:用户名UserName;SN:服务命名ServiceName;ET:过期时间(ExpireTime),字符格式的YYYY:MM:DD:HH:MM:SSCT:当前时间(CurrentTime),字符格式的YYYY:MM:DD:HH:MM:SS(x,y):用“,”连接两个字符串x和y,输出为“x,y”;BC(x):对数据x进行BASE64编码;BD(x):对数据x进行基于BASE64的解码。nR:n个随机的0到9之间数,组成的随机数序列,使用ASCII编码字符串3.2.1.认证请求消息客户向认证服务器发起认证请求,认证请求包括:客户的用户名、客户需要访问的服务的用户名列表、此次认证请求访问每个服务的有效期限;认证请求消息的逻辑结构为UNFor(i=0;in;i++){SNET}3.2.2.认证响应消息认证服务器接收到客户的认证请求后,检查USER_NAME用户是否存在,如果存在则检查该用户的请求服务是否存在,且该用户具有所请求服务的授权。然后返回认证响应消息给客户。认证响应消息的逻辑结构为Sid-A)),((8)(AUPHSidRCBCFor(i=0;in;i++){SidSNET))SK)())SidUNET)((((()()(,,,,,,,BCSKBCCBCCBCSPHUPH}3.2.3.服务请求认证消息客户获得认证响应消息后可以通过以下步骤计算:)SK)())UNET)(((()SK)())UNET)(((()()()()(BCSKBCCBCCBCBDBCSKBCCBCCSPHUPHSPHUPH,,,,,,SK)())UNET)(SK)())SidUNET)((()()(BCSKBCCDBCSKBCCBCUPHUPHSPH,,,,,,,SK=BD(BC(SK))),(,)()(AnUPHUPHASidRCDSidR解密出消息后,客户首先根据认证相应消息中Sid-A与ASidR,中Sid-A判断用户输入口令是否正确,根据设置如果用户输入的口令不正确,客户可以禁止用户登录进行到客户中。当用户需要向某一个服务请求服务时,客户根据需要请求服务的SN,找到对应的))SidUNET)((()(,,,SKBCCBCSPH与SK。客户向服务器发出带有以下认证内容的服务请求认证消息,服务请求认证消息内容的逻辑结构为:{))),(())),SidUNET)(((,,,(8)(RCTCBCSKBCCBCSidCTUNSKSPH,,,}3.2.4.服务程序对服务请求认证消息的处理服务程序获得认证内容后,进行以下运算)))SidUNET)((())SidUNET)(()()(,,,,,,SKBCCBCBDSKBCCSPHSPH))SidUNET)(())SidUNET)(()()(,,,,,,SKBCCDSKBCSPHSPHSK=BD(BC(SK)))),(()),((88RCTCBCBDRCTCSKSK),(),(8)(8RCTCDRCTSKSKH服务器进行以上运算后,进行如下客户端的认证:比较明码传输的CT与解密后的CT、明码传输的Sid与解密后的Sid、明码传输的UN与解密后的UN,如果全部相同则通过认证,否则不能通过认证。在通过客户端认证后,要检查是否存在重放攻击:要验证CT与服务器当前时间的差别,如果差别超过5分钟则不能通过验证,如果CT与服务器时间当前差别不超过5分钟,但是在5分钟内接收到2个Sid、R8相同的认证内容,则认为第二个是重放攻击,因此第二个不能通过认证。为了实现基于webservice系统的统一认证的灵活性,本统一认证方案并没有规定wsdl的接口