① 如何申请SSL证书
一、制作CSR文件
CSR就是Certificate Secure Request证书请求文件。这个文件是由申请人制作,在制作的同时,系统会产生2个密钥,一个是公钥就是这个CSR文件,另外一个是私钥,存放在服务器上。要制作CSR文件,申请人可以参考WEB SERVER的文档,一般APACHE等,使用OPENSSL命令行来生成KEY+CSR2个文件,Tomcat,JBoss,Resin等使用KEYTOOL来生成JKS和CSR文件,IIS通过向导建立一个挂起的请求和一个CSR文件。另外,也可以通过沃通CA提供的CSR在线生成工具在线生成,或者联系沃通CA工作人员协助生成。
二、CA认证
将CSR提交给我们的工作人员,一般有2种认证方式:
1、域名认证,一般通过对管理员邮箱认证的方式,这种方式认证速度快,但是签发的证书中没有企业的名称;
2、企业文档认证,需要提供企业的营业执照。一般需要3-5个工作日。
三、证书的安装
在收到我们发给您的CA证书后,可以将证书部署上服务器,一般APACHE文件直接将KEY+CER复制到文件上,然后修改HTTPD.CONF文件;TOMCAT等,需要将CA签发的证书CER文件导入JKS文件后,复制上服务器,然后修改SERVER.XML;IIS需要处理挂起的请求,将CER文件导入。
以上,依然不知道如何申请,可以联系沃通CA为您提供更加详细周到的帮助。
② 如何使用HttpClient认证机制
HttpClient三种不同的认证方案: Basic, Digest and NTLM. 这些方案可用于服务器或代理对客户端的认证,简称服务器认证或代理认证。
1.服务器认证(Server Authentication)
HttpClient处理服务器认证几乎是透明的,仅需要开发人员提供登录信息(login
credentials)。登录信息保存在HttpState类的实例中,可以通过 setCredentials(String realm,
Credentials cred)和getCredentials(String realm)来获取或设置。
HttpClient内建的自动认证,可以通过HttpMethod类的setDoAuthentication(boolean doAuthentication)方法关闭,而且这次关闭只影响HttpMethod当前的实例。
1.1抢先认证(Preemptive Authentication)
在这种模式时,HttpClient会主动将basic认证应答信息传给服务器,即使在某种情况下服务器可能返回认证失败的应答,这样做主要是为了减少连接的建立。使用该机制如下所示:
client.getParams().setAuthenticationPreemptive(true);
抢先认证模式也提供对于特定目标或代理的缺省认证。如果没有提供缺省的认证信息,则该模式会失效。
Credentials defaultcreds = new UsernamePasswordCredentials("username", "password");
client.getState().setCredentials(new AuthScope("myhost", 80, AuthScope.ANY_REALM), defaultcreds);
Httpclient实现的抢先认证遵循rfc2617.
A
client SHOULD assume that all paths at or deeper than the depth of the
last symbolic element in the path field of the Request-URI also are
within the protection space specified by the Basic realm value of the
current challenge. A client MAY preemptively send the corresponding
Authorization header with requests for resources in that space without
receipt of another challenge from the server. Similarly, when a client
sends a request to a proxy, it may reuse a userid and password in the
Proxy-Authorization header field without receiving another challenge
from the proxy server.
1.2服务器认证的安全方面考虑
当需要与不被信任的站点或web应用通信时,应该谨慎使用缺省的认证机制。当启动(activate)抢先认证模式,或者认证中没有明确给出认证域,主机的HttpClient将使用缺省的认证机制去试图获得目标站点的授权。
如果你提供的认证信息是敏感的,你应该指定认证域。不推荐将认证域指定为AuthScope.ANY。(只有在debugging情况下,才使用)
// To be avoided unless in debug mode
Credentials defaultcreds = new UsernamePasswordCredentials("username", "password");
client.getState().setCredentials(AuthScope.ANY, defaultcreds);
2.代理认证(proxy authentication)
除了登录信息需单独存放以外,代理认证与服务器认证几乎一致。用 setProxyCredentials(String realm, Credentials cred)和 getProxyCredentials(String realm)设、取登录信息。
3.认证方案(authentication schemes)
3.1Basic
是HTTP中规定最早的也是最兼容的方案,遗憾的是也是最不安全的一个方案,因为它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例,可以指定服务器端的访问空间或采用默认的登录信息。
3.2 Digest
是在HTTP1.1 中增加的一个方案,虽然不如Basic得到的软件支持多,但还是有广泛的使用。Digest方案比Basic方案安全得多,因它根本就不通过网络传送实际的密码,传送的是利用这个密码对从服务器传来的一个随机数(nonce)的加密串。
它要求一个UsernamePasswordCredentials实例,可以指定服务器端的访问空间或采用默认的登录信息。
3.3 NTLM
这是HttpClient支持的最复杂的认证协议。它Microsoft设计的一个私有协议,没有公开的规范说明。一开始由于设计的缺陷,NTLM的安全性比 Digest差,后来经过一个ServicePack补丁后,安全性则比较Digest高。
NTLM需要一个NTCredentials实例。
注意,由于NTLM不使用访问空间(realms)的概念,HttpClient利用服务器的域名作访问空间的名字。还需要注意,提供给
NTCredentials的用户名,不要用域名的前缀 - 如: "adrian" 是正确的,而 "DOMAIN\adrian" 则是错的。
NTLM认证的工作机制与basic和digest有很大的差别。这些差别一般由HttpClient处理,但理解这些差别有助避免在使用NTLM认证时出现错误。
[1] 从HttpClientAPI的角度来看,NTLM与其它认证方式一样的工作,差别是需要提供'NTCredentials'实例而不是'UsernamePasswordCredentials'(其实,前者只是扩展了后者)
[2] 对NTLM认证,访问空间是连接到的机器的域名,这对多域名主机会有一些麻烦。只有HttpClient连接中指定的域名才是认证用的域名。建议将realm设为null以使用默认的设置。
[3]
NTLM只是认证了一个连接而不是一请求,所以每当一个新的连接建立就要进行一次认证,且在认证的过程中保持连接是非常重要的。
因此,NTLM不能同时用于代理认证和服务器认证,也不能用于HTTP1.0连接或服务器不支持持久连接(keep-alives)的情况。
关于NTLM认证机制更详细的研究 。
3.4选择认证
一些服务器支持多种认证方案。假设一次只能使用一种认证方案,HttpClient必须选择使用哪种。HttpClient选择是基于NTLM, Digest, Basic顺序的。
在具体情况下,可以更改该顺序。可通过参数'http.auth.scheme-priority'来实现,该参数值应该被存放在一个String类型的List中。选择优先级是按插入顺序确定的。
HttpClient client = new HttpClient();
List authPrefs = new ArrayList(2);
authPrefs.add(AuthPolicy.DIGEST);
authPrefs.add(AuthPolicy.BASIC);
// This will exclude the NTLM authentication scheme
client.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);
③ ssl 服务器如何验证
主机侦探SSL证书商城()专售Symantec、Geotrust、Comodo以及RapidSSL等多家全球权威CA机构的SSL数字证书。我们提供多品牌、多类型SSL证书申请和安装服务,免手续费,全程专业技术指导。
④ WIFI要网络认证,怎么认证,求解答!
网络连接被禁用,解决方法:
(1)在桌面点击“控制面板”,进入控制面板页面。
⑤ 目前在防火墙上提供了几种认证方法
用户是指访问网络资源的主提,表示“谁”在进行访问,是网络访问行为的重要标识。
用户分类:
上网用户
内部网络中访问网络资源的主体,如企业总部的内部员工。上网用户可以直接通过FW访问网络资源。
接入用户
外部网络中访问网络资源的主体,如企业的分支机构员工和出差员工。接入用户需要先通过SSL VPN、L2TP VPN、IPSec VPN或PPPoE方式接入到FW,然后才能访问企业总部的网络资源。
管理用户
认证分类:
防火墙通过认证来验证访问者的身份,防火墙对访问正进行的认证方式有:
本地认证
访问者通过Portal认证页面将标识其身份的用户名和密码发送给FW,FW上存储了密码,验证过程在FW上进行,该方式称为本地认证。
服务器认证(Radius,LDAP等)
访问者通过Portal认证页面将标识其身份的用户名和密码发送给FW,FW上没有存储密码,FW将用户名和密码发送至第三方认证服务器,验证过程在认证服务器上进行,该方式称为服务器认证。
RADIUS(Remote Authentication Dial In User Service)、HWTACACS(HuaWei Terminal Access Controller Access Control System)、AD、LDAP(Lightweight Directory Access Protocol)认证服务器,并在认证服务器上存储了用户/组和密码等信息。对于RADIUS、HWTACACS服务器,管理员需要根据现有的组织结构,在FW上手动创建或者使用文件批量导入相应的用户/组。对于AD或LDAP服务器,管理员可以将AD或LDAP服务器中的用户信息导入到FW上,以便后续管理员可以在FW上通过策略来控制不同用户/组对网络的访问行为。
单点登录
访问者将标识其身份的用户名和密码发送给第三方认证服务器,认证通过后,第三方认证服务器将访问者的身份信息发送给FW。FW只记录访问者的身份信息不参与认证过程,该方式称为单点登录(Single Sign-On)。
短信认证
访问者通过Portal认证页面获取短信验证码,然后输入短信验证码即通过认证。FW通过校验短信验证码认证访问者。
认证的目的:
在FW上部署用户管理与认证,将网络流量的IP地址识别为用户,为网络行为控制和网络权限分配提供了基于用户的管理维度,实现精细化的管理:
基于用户进行策略的可视化制定,提高策略的易用性。基于用户进行威胁、流量的报表查看和统计分析,实现对用户网络访问行为的追踪审计。解决了IP地址动态变化带来的策略控制问题,即以不变的用户应对变化的IP地址。上网用户访问网络的认证方式:
免认证:
FW通过识别IP/MAC和用户的双向绑定关系,确定访问者的身份。进行免认证的访问者只能使用特定的IP/MAC地址来访问网络资源。
会话认证:
当用户访问HTTP业务时,FW向用户推送认证页面,触发身份认证。
一般指的都是本地认证) ----内置Portal认证
先发起HTTP/HTTPS业务访问-------防火墙推送重定向认证页面-----------客户输入用户名和密码----------认证成功,如果设置跳转到最近的页面,就跳转。如果没有设置跳转,就不跳转
事前认证
当用户访问非HTTP业务时,只能主动访问认证页面进行身份认证。
单点认证
AD单点登录:企业已经部署了AD(Active Directory)身份验证机制,AD服务器上存储了用户/组和密码等信息。管理员可以将AD服务器上的组织结构和账号信息导入到FW。对于AD服务器上新创建的用户信息,还可以按照一定的时间间隔定时导入。以便后续管理员可以在FW上通过策略来控制不同用户/组对网络的访问行为。
认证时,由AD服务器对访问者进行认证,并将认证信息发送至FW,使FW能够获取用户与IP地址的对应关系。访问者通过AD服务器的认证后,就可以直接访问网络资源,无需再由FW进行认证,这种认证方式也称为“AD单点登录”。
Agile Controller单点登录
RADIUS单点登录
RADIUS认证原理:
图:旁路模式下RADIUS单点登录示意图
RADIUS单点登录交互过程如下:
访问者向接入设备NAS发起认证请求。
NAS设备转发认证请求到RADIUS服务器,RADIUS服务器对用户账号和密码进行校验,并将认证通过的结果返回给NAS设备。NAS设备向RADIUS服务器发送计费开始报文,标识用户上线。
FW解析计费开始报文获取用户和IP地址的对应关系,同时在本地生成在线用户信息。不同部署方式,FW获取计费开始报文的方式不同:
直路:FW直接对经过自身的RADIUS计费开始报文进行解析。
旁路:NAS设备向RADIUS服务器发送计费开始报文的同时还会向FW发送一份,FW对计费开始报文进行解析并对NAS设备做出应答。
此种部署方式需要NAS设备支持向FW发送计费开始报文的功能。
镜像引流:NAS设备和RADIUS服务器之间交互的计费开始报文不经过FW,需要通过交换机镜像或分光器分光的方式复制一份计费开始报文到FW。FW对计费开始报文进行解析后丢弃。
访问者注销时,NAS设备向RADIUS服务器发送计费结束报文,标识用户下线。FW获取计费结束报文并解析用户和IP对应关系,然后删除本地保存的在线用户信息,完成注销过程。
另外在用户在线期间,NAS设备还会定时向RADIUS服务器发送计费更新报文维持计费过程,FW获取计费更新报文后将刷新在线用户的剩余时间。
接入用户访问网络资源的认证方式:
使用SSL VPN 技术
访问者登录SSL VPN模块提供的认证页面来触发认证过程,认证完成后,SSL VPN接入用户可以访问总部的网络资源。
使用IPSec VPN技术
分支机构与总部建立IPSec VPN隧道后,分支机构中的访问者可以使用事前认证、会话认证等方式触发认证过程,认证完成后,IPSec VPN接入用户可以访问总部的网络资源。
L2TP VPN接入用户
用户认证原理用户组织结构:
用户是网络访问的主体,是FW进行网络行为控制和网络权限分配的基本单元。
认证域:用户组织结构的容器。区分用户,起到分流作用
用户组/用户:分为: 父用户组 子用户组 。
注意:一个子用户组只能属于一个父用户组
用户: 必配: 用户名 密码,其它都可以可选
用户属性:账号有效期 允许多人登录 IP/MAC绑定(不绑定 单向 双向)
安全组:横向组织结构的跨部门群组。指跨部门的用户
规划树形组织结构时必须遵循如下规定:default认证域是设备默认自带的认证域,不能被删除,且名称不能被修改。设备最多支持20层用户结构,包括认证域和用户,即认证域和用户之间最多允许存在18层用户组。每个用户组可以包括多个用户和用户组,但每个用户组只能属于一个父用户组。一个用户只能属于一个父用户组。用户组名允许重名,但所在组织结构的全路径必须确保唯一性。用户和用户组都可以被策略所引用,如果用户组被策略引用,则用户组下的用户继承其父组和所有上级节点的策略。用户、用户组、安全的来源:手动配置CSV格式导入(批量导入)服务器导入设备自动发现并创建在线用户:
用户访问网络资源前,首先需要经过FW的认证,目的是识别这个用户当前在使用哪个IP地址。对于通过认证的用户,FW还会检查用户的属性(用户状态、账号过期时间、IP/MAC地址绑定、是否允许多人同时使用该账号登录),只有认证和用户属性检查都通过的用户,该用户才能上线,称为在线用户。
FW上的在线用户表记录了用户和该用户当前所使用的地址的对应关系,对用户实施策略,也就是对该用户对应的IP地址实施策略。
用户上线后,如果在线用户表项超时时间内(缺省30分钟)没有发起业务流量,则该用户对应的在线用户监控表项将被删除。当该用户下次再发起业务访问时,需要重新进行认证。
管理员可以配置在线用户信息同步,查看到已经通过认证的在线用户,并进行强制注销、全部强制注销、冻结和解冻操作。
用户认证总体流程:
图:认证流程示意图认证策略:
认证策略用于决定FW需要对哪些数据流进行认证,匹配认证策略的数据流必须经过FW的身份认证才能通过。
缺省情况下,FW不对经过自身的数据流进行认证,需要通过认证策略选出需要进行认证的数据流。
如果经过FW的流量匹配了认证策略将触发如下动作:
会话认证:访问者访问HTTP业务时,如果数据流匹配了认证策略,FW会推送认证页面要求访问者进行认证。事前认证:访问者访问非HTTP业务时必须主动访问认证页面进行认证,否则匹配认证策略的业务数据流访问将被FW禁止。免认证:访问者访问业务时,如果匹配了免认证的认证策略,则无需输入用户名、密码直接访问网络资源。FW根据用户与IP/MAC地址的绑定关系来识别用户。单点登录:单点登录用户上线不受认证策略控制,但是用户业务流量必须匹配认证策略才能基于用户进行策略管控。
认证匹配依据:
源安全区域、目的安全区域、源地址/地区、目的地址/地区。
注意:认证策略在匹配是遵循从上往下的匹配策略。
缺省情况下,FW通过8887端口提供内置的本地Portal认证页面,用户可以主动访问或HTTP重定向至认证页面(https://接口IP地址:8887)进行本地Portal认证。
在线用户信息同步功能的服务端口,缺省值是8886。
用户认证配置思路会话认证配置思路:第一步: 基本配置(通信正常) 第二步:新建用户(供本地认证使用) 第三步:认证选项设置重定向跳转到最近的页面 注意:要点应用 第四步:默认重定向的认证端口为8887,需要放行安全策略 ip service-set authro_port type object service 0 protocol tcp source-port 0 to 65535 destination-port 8887 sec-policy rule name trust_loacl source-zone trust destination-zone local service authro_port action permit 第五步:配置认证策略 auth-policy rule name trust_untrust source-zone trust destination-zone untrust source-address 10.1.1.0 mask 255.255.255.0 action auth -------------------默认不认证,修改为认证 第六步:检查 成功以后必须要有在线用户 1617181920212223242526272829免认证配置思路:配置: auth-policy rule name no_auth source-zone trust destination-zone untrust source-address 10.1.1.2 mask 255.255.255.255 action no-auth 12345671234567AD单点登录配置流程:
插件
Server服务器部分
第一步:安装AD域
第二步:安装DNS服务器----配置转发器
第三步:下载AD SSO(在防火墙下载)
第四步:AD域新建组织单元,新建组,新建用户(关联权限)
第五步:PC 加域(DNS修改为服务器地址)
第六步:安装AD SSO (建议安装二次AD SSO)
联动AD域联动FW
第七步:组策略配置登录和注销脚本
调用AD SSO产生的login
格式;
服务器地址 运行端口(AD SSO是一样) 0/1 设置密钥(Huawei@123)
第八步:PC刷新组策略
防火墙部分
第一步:新建防火墙与AD服务器联动
第二步:新建认证域
第三步:把AD服务器用户导入FW ,新建导入策略
第四步: 修改认证域新用户,新用户调用导入策略
第五步:导入用户,到用户列表检查
第六步:配置认证策略
Trust区域到服务器区域(DMZ)不能做认证
第七步:配置安全策略,匹配条件只能是AD域的用户
注意:
FW本地到AD服务器的安全策略
AD服务器到FW本地安全策略
DNS的策略
检查:
一定要看到在线用户-----采用单点登录
参考文档:华为HedEx防火墙文档。
⑥ 微信小程序 HTTPS 请求,如何获取免费证书配置服务器
一、SSL证书,信任符合ATS要求不存在免费,需要签发机构办理认证的:网页链接
二、微信小程序ATS程序要求:服务器支持TLSv1.2协议、PFS(完全正向保密)ECDHE
三、HTTPS请求需要一台独立服务器,并且拿到证书需要专业人员部署到服务器才可以运行,当然如果不会安装可以让签发机构代理部署。
注:如果是商业用途,有一定经济目的的,使用正规的收费产品,很多质量与安全是买来的。
⑦ https怎么获得证书,网站https访问证明弄
HTTPS认证、HTTPS证书,可以在淘宝里面找到Gworg申请。
申请HTTPS证书:
解释原因:
确定并且列出具体需要的域名。
进入淘宝中找到Gworg并且选择HTTPS证书。
根据提示完成HTTPS域名认证。
获得HTTPS证书并且安装到服务器。
解决办法:Gworg认证并且活动和HTTPS证书。
⑧ 如何实现用户认证授权系统
一旦用户注册之后,用户信息就保存在服务器端(DB/Cache)。关键在于用户需要提供身份凭证,一般是用户名和密码。即常见的登陆页面:用户输入username和password,勾选Remember Me(可选,一般是记住一周),点击登陆,提交请求到服务端(这里一般是走HTTPS)。服务端根据用户名和密码到数据库查询是否匹配,如果匹配的话,说明身份认证成功。这是一次普通的身份认证过程。非常好理解。
关键在于HTTP是无状态的,用户登陆过一次,但是如果你没有做一些状态管理操作的话,用户登陆后请求同一个页面,服务器仍然要求其登陆。这时候就需要做一些状态处理了。一般是通过服务器颁发一个登陆凭证(sessionkey/token/ticket)实现的。那么这个登陆凭证是怎么生成的?又是怎样安全的颁发给客户端呢?
方案一:session集群 + 随机sessionId
用户登陆成功之后,服务器为其随机生成的一个sesionId,保存在session服务器中,将这个sessionId与用户关联起来:sessionId=>userId。然后通过cookies方式将sessionId颁发给客户端,浏览器下次请求会自动带上这个sessionId。服务器根据sessionId从session服务器中拿到关联的userId,比较是否与请求的userId相同,如果是则认为是合法请求。
sessionId是随机生成的,基本来说是不可能被猜测出来的,所以这方面的安全还是有一定保障的。
方案二:session-less + 加密算法
上面的Authentication方式其实是用到了session和cookies。我们知道session这东西是服务端状态,而服务端一旦有状态,就不是很好线性扩展。其实对于身份验证来说,服务端保留的也这是一个简单的value而已,一般是userId,即session['sessionId']==>userId。然后再根据userId去DB获取用户的详细信息。如果我们把userId作为一个cookies值放在客户端,然后把用几个cookies值(比如userId)做一个特殊的签名算法得到的token也放在cookie中,即f(userId, expireTime)==>token。这样服务端得到用户请求,用同样的签名算法进行计算,如果得到的token是相等,那么证明这个用户是合法的用户。注意这个签名算法的输入因子必须包含过期时间这样的动态因子,否者得到的token永远是固定的。这种实现方式其实是仿造CSRF防御机制anti-csrf.md。是笔者自己想出来的,不清楚有没有人用过,个人感觉行得通。
然而上面的做法安全性取决于签名算法的隐蔽性,我们可以更进一步的,可以参考API中的签名验证方式,把password作为secretKey,把userId, expireTime, nonce, timestamp作为输入参数,同样用不公开的算法(这个与API签名不同)结合password这个secretKey进行计算,得到一个签名,即f(userId, expireTime, nonce, timestamp, password)==>sign。每次客户端传递userId, expireTime, nonce, timestamp和sign值,我们根据userId获取到password,然后进行f(userId, expireTime, nonce, timestamp, password)==>sign计算,然后比较两个sign是否一致,如果是,表示通过。这种方式比起上面的方式其实区别在于增加了password作为输入参数。这样首先增加签名的破解难度。还带来一个额外的好处,就是当用户修改了password之后,这个token就失效了,更合理安全一些。
具体步骤如下:
1. 客户端 >>>
用户输入userId和password,form表单提交到后台进行登录验证(这里最好走HTTPS)。
2. <<< 服务端
服务端根据userId,从用户信息表中得到用户注册时保存的密码签名:S=md5(password)。
服务器验证用户信息:userId == DB.userId; md5(password) == DB.S。
如果验证通过,说明用户身份认证通过。这时候服务器会为客户端分配一个票据(签名):token=md5(userId;tokenExpiryTime;S;secretKey)。其中secretKey是一个后台统一的密钥,而且跟DB是分开的,一般是写在配置文件中。目的很明显,就是避免将鸡蛋放在同一个篮子中。然后服务端将这个token值存放在cookies中。同样放入cookies中的还有userId和tokenExpiryTime。这些cookies的过期时间都是tokenExpiryTime。
3. 客户端 >>>
客户端每次请求都要带上这个三个cookies(浏览器自动会带上)。
4. <<< 服务端
服务器首先检查tokenExpiryTime是否过期了,如果过期就要求用户重新登录。否则,根据userId cookie从用户信息表中获取用户信息。然后计算expectedToken=md5(userId;tokenExpiryTime;S;secretKey)。然后比较expectedToken是否跟用户提交的token相同,如果相同,表示验证通过;否则表示验证失败。
说明
为了增加安全性,可以进一步将userId, tokenExpiryTime; token 这个三个cookies进行一次对称加密: ticket=E(userId:tokenExpiryTime:token)。
虽然cookies的值是没有加密的,但是由于有签名的校验。如果黑客修改了cookie的内容,但是由于他没有签名密钥secretKey,会导致签名不一致。
google了一下,发现这篇文章跟我的观点不谋而合Sessionless_Authentication_with_Encrypted_Tokens。另外看了一下Spring Security的Remember Me实现,原来这种方式是5.2. Simple Hash-Based Token Approach方式。他的hash因子中也有password,这样当用户修改了password之后,这个token就失效了。
这种基于password和secretKey做token的鉴权方式实现非常简单,而且客户端没有任何计算和验证逻辑,非常适合于BS架构的。不过这种方式在安全性方面还有一些问题:
客户端没法验证服务器的真实性。域名劫持的情况很容易伪造服务器。
token放在cookies中,还是容易被盗取(比如XSS漏洞,或者网络窃听)。使用动态token可以避免这个问题,但是需要持久化token,比较麻烦,而且对性能有消耗5.3 Persistent Token Approach。
一个简单而有效的解决方案就是使用HTTPS。HTTPS使用CA证书验证服务器的合法性,全程会话(包括cookies)都是经过加密传输,刚好解决了上面的两个安全问题。很多网站都是使用这种鉴权认证方案。比如GitHub。不过安全性要求不是很高的网站还是采用的是登陆认证的时候HTTPS,其他情况HTTP的方式,比如新浪微博、亚马逊、淘宝、quora等。
TIPS SSO
上面的鉴权方式依赖于Cookies来传递sessionId,而我们知道Cookies具有跨域限制。不过可以通过一些方式解决。具体可以看一下这篇文章,写的非常好。Building and implementing a Single Sign-On solution。
上面的想法是把password作为一个secretKey或者Salt进行签名。还有另一种思路,就是把password作为对称密钥来进行加密解密。具体步骤如下:
1. 客户端 >>>
用户输入userId和password
客户端用userId和password 计算得到一个签名:H1=md5(password), S1'=md5(H1 + userId)
客户端构造一个消息:message=randomKey;timestamp;H1;sigData。其中randomKey是一个16位的随机数字;SigData为客户端的基本信息,比如userId, IP等。
客户端用对称加密算法(推荐使用性能极高的TEA)对这个消息进行加密:A1=E(S1', message),对称密钥就是上面的S1',然后将userId和A1发送给服务端。
2. <<< 服务端
接收客户端发送的userId和A1。
根据userId,从用户信息表中得到用户注册时保存的签名S1=md5(H1 + userId)。注意服务器保存的不是H1。这个签名就是前面对称加密(TEA)的对称密钥。而且正常情况应该跟客户端根据用户输入的userId和password计算出来的S1'是一样的。
服务端尝试用S1解密A1。如果解密异常,则提示登陆失败。如果解密成功,则按照约定格式,得到message=randomKey;timestamp;H1;sigData
服务器对message中的用户信息进行验证
比较 message.sigData.userId == DB.userId; 如果不一样,那么很有可能数据曾被篡改,或者这是一个伪造的登录的请求,提示登录失败;
比较 message.timestamp与服务器当前的时间,如果差距较大,则拒绝登录,可以从很大程度上防止重放攻击。大家可能都有过经验,当本地时间与真实时间有较大差距的时候,总是会登录失败,其实就是服务器对客户端时间进行校验的原因。
比较 md5(message.H1 + message.sigData.userId) == DB.S1。如果不一致,则登陆失败。
如果验证通过,说明用户身份认证通过,服务器同样构造了一个消息:serverMessage=whaterver you want,一般是登陆凭证,如sessionkey或者token. 然后用客户端发送过来的randanKey进行对称加密:A2=E(randanKey, serverMessage),然后把A2返回给客户端。
3. 客户端 >>>
客户端拿到A2,用randanKey进行解密,如果可以解密成功,则认为是来自真实服务器的数据,而不是一台伪造的服务器,整个登陆流程完成。这个步骤主要是为了防止服务器伪造。这个步骤很容易被忽略,客户端应该和服务器一样,要对接受的数据保持不信任的态度。
这个方案虽然没有使用HTTPS,但是思路跟HTTPS很类似。安全性也很高。
说明
上面的认证过程其实就是着名的网络认证协议Kerberos的认证过程。Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。它的设计主要针对客户-服务器模型,并提供了一系列交互认证——用户和服务器都能验证对方的身份。Kerberos协议可以保护网络实体免受窃听和重复攻击。QQ的登录协议都是基于Kerberos的思想而设计的。不过Kerberos也有一些安全性的问题。SRP协议Secure Remote Password protocol要更安全一些。据说是目前安全性最好的安全密码协议。
为什么DB保存S1而不是H1。这是为了提高批量暴力破解的成本。对经过两次MD5加密,再加上userId作为salt,得到的S1进行暴露反推pasword基本是不可能的。而反推H1的话,由于H1的是password的MD5值,相对于password来说强度要增强不少。这个读者可以自己试试md5('123456')看得到的H1就有直观的认识了。
为什么服务端解开对称加密后的message之后还要对message的内容进行验证。这是为了避免拖库后的伪造登录。假设被拖库了,黑客拿到用户的S1,可以伪造用户登录(因为我们的加密算法是公开的)。它能够通过服务器第一个验证,即服务端使用存储的S1能够解开消息;但是无法通过第二个验证,因为H1只能是伪造的,这是因为根据S1反推H1是很困难的(原因见上面Note.2)。
但是虽然上面的协议可以防止黑客拖库后伪造用户登陆,却无法防止黑客拖库后伪造服务器,以及进行中间人攻击。拖库之后,黑客拥有DB.S1,协议又是公开的,这相当于黑客拥有了伪造Server的能力。黑客通过DB.S1解开客户端发送的A1,得到userId, H1=MD5(pwd), 以及randomKey。这样,黑客就可以轻易的得到被监听用户的H1了,而不需要通过S1进行反推。黑客就可以直接用H1伪造合法的用户登录请求了。如果pwd不够复杂,那么还很容易被暴力破解。黑客拦截客户请求,利用破解得出的randomKey回复一个假的响应,达到伪造Server的目的。黑客还可以同时伪造用户和Server,进行中间人攻击,从而达到窃听用户会话内容的目的。美国“棱镜门”就是类似案例。甚者在必要的时候对会话内容进行篡改。当然,黑客拖库后只能破解他监听网络所截取到的受害用户的MD5(pwd),比起服务器存MD5(pwd)的影响面窄多了,所以建议服务器还是不要直接存MD5(pwd)。
可以在现有登陆流程基础上加上密钥交换算法(如ECDH)解决上面的问题。具体流程如下:
==前置条件==
服务端生成一对私钥serverPrivateKey和公钥serverPublicKey,公钥直接hardcode在客户端,而不是通过网络传输。
1. 客户端 >>>
用户输入userId和password
客户端用对称加密算法对消息进行加密:A1=TEA(S1', randomKey;timestamp;H1;userId),对称密钥S1'=md5(md5(password) + userId)`
客户端生成自己的一对公钥clientPublicKey和密钥clientPrivateKey。
客户端用serverPublicKey对A1和clientPublicKey进行非对称加密: ECDH(serverPublicKey, userId + A1 + clientPublicKey),然后将加密结果发送给服务端。
2. <<< 服务端
使用serverPrivateKey对客户端发送信息进行解密,得到userId, A1 和 clientPublicKey。
根据userId,得到DB.S1。然后尝试用DB.S1解密A1。如果解密异常,则提示登陆失败。如果解密成功,则按照约定格式,得到message=randomKey;timestamp;H1;userId
服务器对message中的用户信息进行验证:
比较 message.sigData.userId == DB.userId
比较 message.timestamp与服务器当前的时间,如果差距较大,则拒绝登录,可以从很大程度上防止重放攻击
比较 md5(message.H1 + message.sigData.userId) == DB.S1
如果验证通过,说明用户身份认证通过。服务器用客户端发送过来的randanKey进行对称加密:A2=TEA(randanKey, sessionKey + 业务票据)
服务端使用clientPublicKey对A2进行加密: ECDH(clientPublicKey, A2), 然后把加密结果返回给客户端。
3. 客户端 >>>
客户端使用clientPrivateKey对服务器回包进行解密,得到A2。
用randanKey对A2进行解密,如果可以解密成功,则认为是来自真实服务器的数据,而不是一台伪造的服务器,整个登陆流程完成。
4. ==后续通讯==
由于非对称加密算法(如RSA、ECC)的计算复杂度相比对称加密高3个数量级,不太可能用作通信数据的加密。所以验证通过之后,服务端和客户端利用ECDH交换密钥算法独自计算出一样的密钥,后面的通讯应该还是基于对称加密。这个跟HTTPS是类似的。
说明
加上非对称加密之后,即使黑客知道了S1,也没有办法伪造服务器,因为他不知道serverPrivateKey。黑客也不可能伪造客户端。因为即使黑客拖库知道S1,并且通过反编译客户端应用程序知道serverPublicKey,如果不是通过窃听网络得到A1,用S1解密A1从而得到A1中的H1的情况下,基本是不可能通过S1反推H1的。现在A1包在不对称加密算法上,黑客如果不知道serverPrivateKey和clientPrivateKey就无法解开会话信息。
这里看到serverPublickKey是HardCode在客户端的,而不是通过公钥推送下发的。这里是为了保证客户端的serverPublicKey是真正的serverPublicKey,而不是来自伪造服务器的。如果serverPublicKey通过网络传输下发给客户端的,那么伪造服务器在劫持网络的情况下,完全可以拦截客户请求,发回伪造服务器自己的fake_serverPublickKey,客户端在不知情的情况就用fake_serverPublickKey向伪造服务器发数据,因为fake_serverPublicKey是黑客构造的,他当然有对应的fake_serverPrivateKey解开。当然,黑客还需要知道S1才能解开A1。当然,将serverPublicKey硬编码在客户端会导致更换密钥需要强制客户端一起升级,否则老版本的客户端将无法登陆。
客户端自己也生成了公钥和私钥,目的是为了验证服务器是真正的服务器,这个得以成立的前提是公钥是真正的服务器公钥,如果是伪造服务器的公钥,那等于向黑客公开了自己加密的内容,黑客就知道了客户端的公钥,就能伪造服务器的返回数据。
采用ECDH非对称加密算法包裹后的登陆认证协议,安全级别已经跟SRP差不多。相对于SRP协议的问题是ECDH安全性依赖于私钥的保密性,如果私钥泄漏安全性回到跟未加ECDH的时候一样。ECDH的私钥保密有以下一些办法(考虑到实现成本,推荐方案2)
私钥加强保密,做到绝密,不用换,也不准备换;例如用USBKEY等硬件方式。
私钥密码级别安全,定期更换,换的时候让客户端拉取。具体实现方法是第一步验密的成功的以后,发现要更新公钥,在返回的加密信道中返回新的公钥。
使用Verisign等第三方证书,确保公钥的合法性,在2的基础上不会增加网络交互。
完全使用TLS的协议,会导致每次登录增加一次交互。
另外,采用不对称加密算法,会有一个服务器间共享密钥的安全VASKEY的问题:
换key困难,架构设计导致
网络上对称加密传输新密钥,可能被破解
可能的解决方案:
VASKEY的业务Key管理目前是对称加密的方式,可以考虑换成ECDH或类似的密钥交换协议来动态更新Key。
集中验证签名和解密,不共享密钥。
这里推荐采用方案2。
最后一个容易忽略的地方是注册。采用HTTP注册相当于明文传递用户名和密码,存在劫持、中间人攻击的危险。将注册入口全部改为HTTPS,封掉HTTP注册可以去掉上述危险。但是如果黑客劫持网络,给用户返回HTTP的页面,代理请求的HTTPS注册接口,也能窃取密码。
TIPS && THOUGHTS
基本上所有的安全的登陆鉴权协议都是采用HTTPS的思想:使用不对称密钥算法进行登陆验证以及对称密钥交换。通过之后,后续会话就用对称加密算法加密。但是与HTTPS采用CA证书不同的是,一般通过密钥本身来验证客户端和服务器的合法性。
对于对称加密算法安全性问题更好的解决办法是加密算法协商,而不在于寻找破解难度更大的算法。在验密码之前协商后续会话使用的对称加密算法,如果有安全性更好的算法或者正在使用的算法被破解了,只需要Server增加对更安全算法的支持,新版本的客户端就可以使用安全性更好的算法。支持对称加密算法协商以后可以随时动态的升级或替换加密算法,不用担心对称加密算法被破解的安全风险。HTTPS就是这样的一种思路。
HTTP登录无法防劫持,HTTPS登录可以防劫持,但是无法防止后续对业务会话的窃听。另外,CA也容易被伪造。
关于暴力登录。处理方式有几种:1. 验证码; 2. 一定时间内密码错误次数超过正常值,锁定账户; 3. 客户IP监控。
第三方爆库、钓鱼、扫号、撞库如果解决?这些问题等同于用户明文密码被盗,靠密码登录体系没有办法对抗,比较好的方式是对已知泄漏密码的用户进行封停,强制要求用户改密码等运营方式减少用户的财产损失。
上面所有的验证方式,每次请求都需要根据userId去数据库拉取用户信息(password)。所以最好结合缓存进行处理,毕竟用户信息变化频率还是比较小的。
这种鉴权认证方式,相对于前面的token方式而言,客户端有比较多的计算和验证逻辑,比较适合于CS架构,特别是手机App。而且,它不依赖于Cookies,所以天然具有SSO功能。
More about 密码强度 && 暴力破解
1. 加盐之外我们还可以做些什么?
加盐以后的密码存储体系已经有效的对抗批量暴力破解、彩虹表攻击、字典攻击。为了对抗针对单个密码的暴力破解,我们可以通过密钥加强(Key Stretching)、提高密码长度等方式来提高安全性。
密钥加强的基本思路是让每次鉴权的时间复杂度大到刚好不影响用户体验,但是黑客暴力破解或构建彩虹表的成本大幅度提高,目前标准的算法有BCRYPT、SCRYPT、PBKDF2等。密钥加强算法的本质是通过加盐以及迭代计算多次增加计算量,迭代次数增加1000次计算量翻1000倍,这种方式对单个密码的暴力破解作用不大。
提高密码长度对构建彩虹表暴力破解的成本影响非常大,提高密码长度提升单个帐号的密码安全价值很大。以目前暴力破解MD5能力最强的FPGA NSA@home计算量来估算(大概用一台pc电脑的功耗,每秒钟可进行30亿次的8位密码(密码空间64个字符)尝试),假设有1万个NSA@home集成电路,19秒就能破解8字符的密码(70个字符的密码空间),所以现在的很多密钥检验要求的最小长度6个字符其实是不安全的,如果把密码长度增加到12个字符,则需要1年才能破解。
2. GPU,FPGA,ANIC对上述密码强度有何挑战?
FPGA MD5暴力破解工具目前比较成熟的是NSA@home,大概用一台pc电脑的功耗,每秒钟可进行30亿次的8位密码(密码空间64个字符)尝试。Lightning Hash Cracker[7]使用9800GX2 GPU每秒能够完成密码MD5计算608M次。
类似FPGA,GPU这种暴力破解方式受密码字符空间、密码长度、密码计算强度影响比较大,可以通过提升密码长度、密码计算强度来提升安全性。只替换密码Hash算法对这种破解作用不大,SHA2的计算量不到MD5计算量的一倍,把MD5换成SHA2只是让暴力破解的计算量增加了一倍,但是如果密码长度增加1位对计算量的提升是非常巨大的。
对于对称加密算法,没有专门针对TEA的硬件设计,针对AES算法,有一篇论文针对AES128专门设计的类似GPU的硬件计算速度能达到1012次/秒(约240次/s),AES128暴力破解需要288秒,这个计算量目前也是安全的。这种对称加密算法的暴力破解只能通过提升密钥长度来对抗。128位的AES与TEA安全级别差不多,AES支持最长256位密钥,长远来看对抗暴力破解AES更有优势。然而,对于对称加密算法安全性问题更好的解决办法是加密算法协商,而不在于寻找破解难度更大的算法。
⑨ 移动App如何与服务器端进行身份认证
OAuth2一般不适用公司内部API调用,因为它的主要目的是解决资源授权的问题,而且OAuth2里面角色对于C/S结构的app来说太过于繁杂了,不太有必要折腾。
移动app比较简单的方法还是使用token(一种类似与httpcookie的东西),登录之后得到token,任何请求都必须带上它。因为是内部账户体系,登录也可以直接使用用户名密码,验证成功服务器就返回token,没有必要做各种code/token交换的事情。
不过如果公司资源变得非常独立和分离了,OAuth2还是很有价值的。部门公司,为了让公司内部统一用户名密码,就实现了一个基本的OAuth2流程,负责给各种内网网站授权,确实比较方便。