HTTPS接口加密和身份认证(转) - CSDN博客
HTTPS接口加密和身份认证(转)
HTTPS接口加密和身份认证
对HTTPS研究有一段时间了,在这里写下一些收集的资料和自己的理解。有不对的地方希望斧正。
1.为什么要使用HTTPS代替HTTP
1.1HTTPS和HTTP的区别
https协议需要到CA申请***,一般免费***很少,需要交费。
http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
1.2 HTTP为什么不安全
http协议没有任何的加密以及身份验证的机制,非常容易遭遇窃听、劫持、篡改,因此会造成个人隐私泄露,恶意的流量劫持等严重的安全问题。
就像寄信一样,我给你寄信,中间可能会经过很多的邮递员,他们可以拆开信读取里面的内容,因为是明文的。如果你的信里涉及到了你们银行账号等敏感信息,可能就会被窃取。除此之外,邮递员们还可以给你伪造信的内容,导致你遭到欺骗。
1.3 HTTPS如何保证安全
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTPS,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
2.HTTPS的加密原理
2.1首先先介绍一些加密过程中用到的原理:
2.1.1对称加密
对称加密是指加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信至关重要。
对称加密算法的优、缺点:
优点:算法公开、计算量小、加密速度快、加密效率高。
交易双方都使用同样钥匙,安全性得不到保证;
每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。
能提供机密性,但是不能提供验证和不可否认性。
2.1.2非对称加密算法
这种加密或许理解起来比较困难,这种加密指的是可以生成公钥和私钥。凡是公钥加密的数据,公钥自身不能解密,而需要私钥才能解密;凡是私钥加密的数据,私钥不能解密,需要公钥才能解密。这种算法事实上有很多,常用的是RSA,其基于的数学原理是两个大素数的乘积很容易算,而拿到这个乘积去算出是哪两个素数相乘就很复杂了,具体原理有兴趣可以自行研究。
非对称加密相比对称加密更加安全,但也存在两个明显缺点:
CPU计算资源消耗非常大。一次完全TLS握手,密钥交换时的非对称解密计算量占整个握手过程的90%以上。而对称加密的计算量只相当于非对称加密的0.1%,如果应用层数据也使用非对称加解密,性能开销太大,无法承受。
非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是2048位,意味着待加密内容不能超过256个字节。
所以公钥加密目前只能用来作密钥交换或者内容签名,不适合用来做应用层传输内容的加解密。
2.1.3身份认证(CA数字***)
https协议中身份认证的部分是由数字***来完成的,***由公钥、***主体、数字签名等内容组成,在客户端发起SSL请求后,服务端会将数字***发给客户端,客户端会对***进行验证,并获取用于秘钥交换的非对称密钥。
数字***有两个作用:
身份授权。确保浏览器访问的网站是经过CA验证的可信任的网站。
分发公钥。每个数字***都包含了注册者生成的公钥。在SSL握手时会通过certificate消息传输给客户端。
申请一个受信任的数字***通常有如下流程:
终端实体(可以是一个终端硬件或者网站)生成公私钥和***请求。
RA(***注册及审核机构)检查实体的合法性。如果个人或者小网站,这一步不是必须的。
CA(***签发机构)签发***,发送给申请者。
***更新到repository(负责数字***及CRL内容存储和分发),终端后续从repository更新***,查询***状态等。
数字***验证:
申请者拿到CA的***并部署在网站服务器端,那浏览器发起握手接收到***后,如何确认这个***就是CA签发的呢?怎样避免第三方伪造这个***?***就是数字签名(digital signature)。数字签名是***的防伪标签,目前使用最广泛的SHA-RSA(SHA用于哈希算法,RSA用于非对称加密算法)数字签名的制作和验证过程如下:
数字签名的签发。首先是使用哈希函数对待签名内容进行安全哈希,生成消息摘要,然后使用CA自己的私钥对消息摘要进行加密。
数字签名的校验。使用CA的公钥解密签名,然后使用相同的签名函数对待签名***内容进行签名并和服务端数字签名里的签名内容进行比较,如果相同就认为校验成功。
需要注意的是:
数字签名签发和校验使用的密钥对是CA自己的公私密钥,跟***申请者提交的公钥没有关系。
数字签名的签发过程跟公钥加密的过程刚好相反,即是用私钥加密,公钥解密。
现在大的CA都会有***链,***链的好处一是安全,保持根CA的私钥离线使用。第二个好处是方便部署和撤销,即如果***出现问题,只需要撤销相应级别的***,根***依然安全。
根CA***都是自签名,即用自己的公钥和私钥完成了签名的制作和验证。而***链上的***签名都是使用上一级***的密钥对完成签名和验证的。
怎样获取根CA和多级CA的密钥对?它们是否可信?当然可信,因为这些厂商跟浏览器和操作系统都有合作,它们的公钥都默认装到了浏览器或者操作系统环境里。
2.2加密的详细过程
首先服务器端用非对称加密(RSA)产生公钥和私钥。然后把公钥发给客 户端,路径或许有人会截取,但是没有用,因为用公钥加密的文件只有私钥可以解密,而私钥永远都不会离开服务器的。当公钥到达客户端之后,客户端会用对称加密产生一个秘钥并且用公钥来加密发送给服务器端,这个秘钥就是以后用来通信的钥匙。这样服务器端收到公钥加密的秘钥时就可以用私钥来解公钥从而获得秘钥。这样的话客户端和服务器端都获得了秘钥,信息交流相对是安全的。流程图如下:
听起来确实是挺安全的,但实际上,还有一种更恶劣的攻击是这种方法无
法防范的,这就是传说中的“中间人攻击”。在身份认证的过程中,出现了一个“中间人”拦截我们的信息,他有意想要知道你们的消息。我们将这个中间人称为M。当服务器第一次给客户端发送公钥的时候,途径M。M知道你要进行密钥交换了,它把公钥扣了下来,假装自己是客户端,伪造了一个伪秘钥(对称加密产生的),然后用服务器发来的公钥加密了伪秘钥发还给服务器,这样服务器以为和客户端完成了密钥交换,实际上服务器是和M完成了密钥交换(获得了伪秘钥)。同时M假扮成服务器自行用非对称加密产生伪公钥和伪私钥,与客户端进行秘钥交换,拿到客户端发送过来的秘钥。现在客户端拿着秘钥,M拿着秘钥和为伪秘钥,服务器拿着伪秘钥,整个交流的过程就是:
简单点说就是:
客户端用秘钥加密信息发送给M;
M收到后用秘钥解密拿到信息,然后用伪秘钥加密信息发送给服务器;
服务器收到后用伪秘钥解密拿到信息。
这样中间人M就拿到了客户端和服务器所有的交流信息。
对于这种攻击,我们可以加上身份认证:这个时候就要引入CA***,CA***的原理可回到2.1.3。数字***中包括的主要内容有:***拥有者的个人信息、***拥有者的公钥、公钥的有效期、颁发数字***的CA、CA的数字签名等。所以网上双方经过相互验证数字***后,不用再担心对方身份的真伪,可以放心地与对方进行交流或授予相应的资源访问权限。
通俗一点理解就是,服务器端把公钥交个CA***,CA***再包装一层。(具体原理请回看2.3)然后再发给客户端,这个包装一层的意思是:保证这个***是我(服务器)给你(客户端的),其他人拿到了也没有用。
最后,你可能会想既然非对称加密可以那么安全,为什么我们不直接用它来加密信息,而是用来加密对称加密的密钥呢?
这是因为非对称加密的密码对生成和加密的消耗时间比较长,为了节省双方的计算时间,通常只用它来交换密钥,而非直接用来传输数据(具体的可看上文非对称加密的缺点)。
3.使用AFNetworking进行双向认证
3.1客户端认证服务器端***
如上图所示客户端想要认证服务器,首先需要和服务端的数字***匹配(server.cer),具体方法如下。
在项目中导入***sever.cer和AFNetworking框架:
然后到AFSecurityPolicy.m中重写
+ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode
AFNetworking2是允许内嵌***的,通过内嵌***,AFNetworking2通过比对服务器端***、内嵌的***、站点域名是否一致来验证连接的服务器是否正确。在完成以上两条的情况下,会自动扫描bundle中.cer的文件,并引入,这样就可以通过自签***来验证服务器唯一性了。
3.2服务器端认证客户端
服务端验证客户端***,首先把服务端的***client.p12导入到服务端的密钥库里,同时导入工程;
在AFURLConnectionOperation.m中加入以下方法:
重写AFURLConnectionOperation.m中的- (void)connection:(NSURLConnection*)connection
如果是需要认证的时候不会先调用didReceiveResponse,而是先调用3)和2)的函数,NSURLAuthenticationChallenge是一个认证挑战类,也就是要求客户端进行挑战,要接收挑战也就是客户端提供挑战的凭证(用户和密码,或者客户端***,或者信任服务器***,或者代理),IOS提供了一个NSURLCredential的类来表示挑战凭证。可以通过如下函数来建立挑战凭证。所以访问https的时候服务器认证客户端就调用这个方法。
这两段代码是通过p12文件来验证服务器的,需要自己修改的地方只有一个,那就是2)中的CFStringRefpassword =CFSTR("123456");这是p12***的密码,用自己的p12***密码替换"123456"。
4.3控制器里如何请求
通过4.1和4.2我们的客户端和服务器双向认证已经设置好了,在控制器里只需要需要调用
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
的方法来进行双向认证:
然后就可以访问HTTPS的服务器了。
提示:本博文为转载文章,
微信公众号:
有问必答QQ群:
本文已收录于以下专栏:
相关文章推荐
以下是理论部分,仅供理解参考,如果要粘代码,网上会有很多,此处不再提供
关于https加密:
https是在http的基础上多了一次协议ssl,该协议用来给传输的内容进行加密
https加密流程:
HTTPS访问方法的代码,抄一个能用的DEMO吧,我测试过的,可以用、,希望对大家也有用 import java.io.*;import java.net.*;import java.security...
当你访问一个网站时,有没有想过这个问题:如何保证我的访问能直达目标网站,而没有被中间人攻击和劫持。想要解决这个问题,就得依靠HTTPS中的身份认证机制。
HTTPS的基本概念,我在前面的文章介绍...
转自:http://www.blogjava.net/etlan/archive//55767.html
摘 要 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可...
问题:当tomcat里面的请求做了redirect的时候,会重定向到http请求,而不是https请求,这个时候就需要做如下配置:
把http重定向到https使用了nginx的重定...
平台如何实现授权的访问控制对于了解我们将在本章中讨论的概念很重要。Java
平台使用访问控制环境(access control context)的概念来确定当前执行线程...
SSL/TLS握手过程可以分成两种类型:
1)SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换***。
2)SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不...
import java.io.BufferedR
import java.io.FileInputS
import java.io.IOE
前言:
在android开发中,会涉及到安全比较高的业务,比如银行,网上交易等,这就涉及到https协议的交互
对于https 交互过程分两个阶段
用两种方式分别实现了,第一种是jdk原生的,代码稍微多点,第二种是基于httpclient4版本的。在我的机器上,访问同一个接口原生的性能要好很多(前者900ms,后者5.7s左右),httpclie...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)iOS验证***号码是否合法 - 简书
iOS验证***号码是否合法
正好用到,作为纪录,代码丢完就走
//验证***号码
+(BOOL)checkIdentityCardNo:(NSString*)cardNo
if (cardNo.length != 18) {
NSArray* codeArray = [NSArray arrayWithObjects:@"7",@"9",@"10",@"5",@"8",@"4",@"2",@"1",@"6",@"3",@"7",@"9",@"10",@"5",@"8",@"4",@"2", nil];
NSDictionary* checkCodeDic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"0",@"X",@"9",@"8",@"7",@"6",@"5",@"4",@"3",@"2", nil]
forKeys:[NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10", nil]];
NSScanner* scan = [NSScanner scannerWithString:[cardNo substringToIndex:17]];
BOOL isNum = [scan scanInt:&val] && [scan isAtEnd];
if (!isNum) {
return NO;
int sumValue = 0;
for (int i =0; i&17; i++) {
sumValue+=[[cardNo substringWithRange:NSMakeRange(i , 1) ] intValue]* [[codeArray objectAtIndex:i] intValue];
NSString* strlast = [checkCodeDic objectForKey:[NSString stringWithFormat:@"%d",sumValue%11]];
if ([strlast isEqualToString: [[cardNo substringWithRange:NSMakeRange(17, 1)]uppercaseString]]) {
return YES;
实际使用场景
- (void)textFieldDidEndEditing:(UITextField *)textField{
if (textField == _tfId) {
if (![MyTool checkIdentityCardNo:textField.text]) {
[self showMessage:@"请输入合法的***号"];
_tfId.text = @"";
逆水行舟,不进则退
温故知新,举一反三iOS 调用TouchID 身份验证 - CSDN博客
iOS 调用TouchID 身份验证
iOS8后苹果开放了Touch ID的API给开发者,这也给我们的app带来了新的体验。开发者们可使用向第三方应用开放了Touch ID权限的API,以便他们在应用中使用指纹认证来完成用户认证或支付购买。本文主要介绍如何在应用中集成Touch ID来校验用户的身份和注意事项。
iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然***iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论上第三方软件不可使用。
在使用前我们需要导入&LocalAuthentication.framework&这个库
这个库必须要Xcode6并且连接的是真机,才不会提示找不到的错误。 如果是模拟器会提示找不到这个库。
做iOS 8以下版本适配时,务必进行API验证,避免调用相关API引起崩溃。
LAContext&指纹验证操作对象
//验证是否支持TouchID
- (void)judgeCanTouchId
LAContext *context = [LAContext new];
context.localizedFallbackTitle = @&输入密码&;
if ([context canEvaluatePolicy:(LAPolicyDeviceOwnerAuthenticationWithBiometrics) error:&error])
NSLog(@&支持使用&);
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:NSLocalizedString(@&通过验证指纹解锁&,nil) reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@&验证成功&);
// 用户未提供有效***,(3次机会失败 --身份验证失败)。
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
// 认证被取消,(用户点击取消按钮)。
LAErrorUserCancel
= kLAErrorUserCancel,
// 认证被取消,用户点击回退按钮(输入密码)。
LAErrorUserFallback
= kLAErrorUserFallback,
// 身份验证被系统取消,(比如另一个应用程序去前台,切换到其他 APP)。
LAErrorSystemCancel
= kLAErrorSystemCancel,
// 身份验证无法启动,因为密码在设备上没有设置。
LAErrorPasscodeNotSet
= kLAErrorPasscodeNotSet,
// 身份验证无法启动,因为触摸ID在设备上不可用。
LAErrorTouchIDNotAvailable
= kLAErrorTouchIDNotAvailable,
// 身份验证无法启动,因为没有登记的手指触摸ID。 没有设置指纹密码时。
LAErrorTouchIDNotEnrolled
= kLAErrorTouchIDNotEnrolled,
if (error.code == kLAErrorUserFallback) {
NSLog(@&用户选择了另一种方式&);
else if (error.code == kLAErrorUserCancel)
NSLog(@&用户取消&);
else if (error.code == kLAErrorSystemCancel)
NSLog(@&切换前台被取消&);
else if (error.code == kLAErrorPasscodeNotSet)
NSLog(@&身份验证没有设置&);
NSLog(@&验证失败&);
NSLog(@&不支持使用&);
运行一下ok了
本文已收录于以下专栏:
相关文章推荐
背景:有个朋友说有没有办法把iPhone上的相册、备忘录加密(现在的备忘录是苹果已经加入了加密功能),于是想了下要怎么实现保存的数据实现访问加密、解密功能。
要提高逼格肯定是使用指纹...
iOS 8的SDK开放了Touch ID的接口.从WWDC的视频中可以看到Touch ID应用在两个方面:用于Key Chain加密和用于授权.iOS 8正式版发布以后我们可以看到Evernote的i...
转载自:/hot-404000.htm
本文为大家介绍了iOS开发ASIHTTPRequest身份验证的内容,其中包括为URL指定要使用的用户名...
CXF服务端代码:
1、web.xml配置
xml version="1.0" encoding="UTF-8"?>
web-app ve...
众所周知,WebService是为企业需求提供的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。但在有些时候的某些应用服务不希望被未授权访问,那么此时我们可以一下几种...
和工商对接数据,对方提供的webservices地址 带有https:, 并提供了***、访问的用户名和密码。
用java调用,开发工具输入https直接访问不了,网站教的办法也不行,
最后改用C#...
C#调用Web Service时的身份验证
在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑以下问题:怎么防止别人访问我的WebService?从哪...
采用WSHttpBinding绑定模式和None传输安全模式不能通过服务器访问的问题
这个问题已经困扰好久了,找度娘,找谷歌都没有解决,最后还是决定好好的翻翻书本,这下给搞定了。
话说我只是初学者...
众所周知,WebService是为企业需求提供的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。但在有些时候的某些应用服务不希望被未授权访问,那么此时我们可以一下几种...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)