网络安全漏洞API接口安全(https,对称,非堆成,公钥,私钥)

一 URL转码问题

    1. 什么是URL 转码问题?

不管是以何种方式传递url时,如果要传递的url中包含特殊字符,如想要传递一个+,但是这个+会被url编码成空格,想要传递&,被url处理成分隔符。 尤其是当传递的url是经过Base64加密或者RSA加密后的,要进行传输时,存在特殊字符时,这里的特殊字符一旦被url处理,就不是原先你加密的结果了。

 

符号

url中的含义

编码

+

URL 中+号表示空格

%2B

空格

URL中的空格可以用+号或者编码

%20

/

分隔目录和子目录

%2F

?

 

 

 

 

 

 

 

 

分隔实际的URL和参数

%3F

%

指定特殊字符

%25

#

表示书签

%23

&

URL中指定的参数间的分隔符

%26

=

URL中指定参数的值

%3D

 

如上表格所示,如果我们要传递特殊符号到服务器端,而又不被浏览器或者https请求进行特殊处理。最好的方式就是传递符号的编码。这样到了另一端服务器进行解码以后,就可以得到你想输入的特殊符号。

  如上图所示,我们在地址栏里输入1+1,回显到另一个界面之后变成了1 1 这样的组合。实际上+号在传输过程中被转码为空格符了。那么如果要显示1+1要怎么做呢?

如你看到的要输入1%2B1这样的形式,在服务器端,才能看到1+1这样的字符输出

这就意味着我们在传输含有特殊符号的字符串的时候,为了不被请求转码成其他格式,我们

就需要把带有特殊符号的字符串进行URL编码。在另一方进行URL解码,这样才能够实现带特殊符号的字符串的传输。

    1. URL的编码解码方式
 
  1. String encode = URLEncoder.encode("1+1", "UTF-8");

  2.  
  3. String decode = URLDecoder.decode(encode, "UTF-8");

  4.  
  5. System.out.println("encode:" + encode + ",decode:" + decode);

 如上代码所示是对URL的参数进行编码解码的过程。这也是我们在通过http协议做参数传输的时候需要注意的事项。对参数进行编码解码。

    1. URL带特殊符号的参数传输方式
 
  1. String url = "http://127.0.0.1:8080/tranIndex?";

  2.  
  3. // 参数转码

  4.  
  5. String strParam = "name=" + URLEncoder.encode("1+1", "utf-8");

  6.  
  7. String newUrl = url + strParam;

  8.  
  9. String result = HttpClientUtils.httpGet(newUrl);

  10.  
  11. System.out.println("result:" + result);

 

如上代码段所示是要带参数进行远程传输的时候,我们需要对带有特殊符号的参数进行传输的时候,需要通过URLEncoder对参数进行编码以后再做传输。

 

二 app服务端核心识别设计

 
  1.  
  2. CREATE TABLE `m_app` (

  3.  
  4. `id` int(11) NOT NULL AUTO_INCREMENT,

  5.  
  6. `app_name` varchar(255) DEFAULT NULL,

  7.  
  8. `app_id` varchar(255) DEFAULT NULL,

  9.  
  10. `app_secret` varchar(255) DEFAULT NULL,

  11.  
  12. `is_flag` varchar(255) DEFAULT NULL,

  13.  
  14. `access_token` varchar(255) DEFAULT NULL,

  15.  
  16. PRIMARY KEY (`id`)

  17.  
  18. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

  19.  

如上面的表结构设计所示。如果你是为一个移动端APP开发一套服务平台。那么如上所示的表结构应该是核心的设计了。因为如上表结构所示是可以通过一套服务器端,登记多个客户端App的方式。如上我们可以看到

App_id 登记唯一一款app。

App_secret 是这款app的唯一识别符,如果app_secret如果端口泄露等等,可以通过变更app_secret 还防止接口的安全调用

Is_flag是对这款app的合作关系的体现。

如上所示我们可以看到,通过app_id,app_secret就能避免我们的接口提供给其他外部设备。但是我们还不能够保证数据的安全性。也就是此时我们的数据是通过明文进行传输的。我们要尽量用密文进行传输才行。

三 Auth2.0

3.1 什么是Auth2.0

OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。QQ登录OAuth2.0采用OAuth2.0标准协议来进行用户身份验证和获取用户授权,相对于之前的OAuth1.0协议,其认证流程更简单和安全。

3.2 Auth2.0的步骤

第一步:用户同意授权,获取code

第二步:通过code换取网页授权access_token

第三步:刷新access_token(如果需要)

第四步:拉取用户信息(需scope为 snsapi_userinfo)

 

以上的auth2.0协议也是第三方登录的基本认证过程。关于auth2.0的具体实现过程我就不在描述了。可以去体验第三方登录。

 

四 单向加密

散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。


单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:
1、MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
2、SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;
SHA-1与MD5的比较
因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
1、对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
2、对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3、速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

4 由于单向加密技术容易被破解。所以我们需要通过对单向加密,进行加盐的处理。

1、特征:雪崩效应、定长输出和不可逆。
2、作用是:确保数据的完整性。
3、加密算法:md5(标准密钥长度128位)、sha1(标准密钥长度160位)、md4、CRC-32
4、加密工具:md5sum、sha1sum、openssl dgst。
5、计算某个文件的hash值,例如:md5sum/shalsum FileName,openssl dgst –md5/-sha

 

 

五 对称加密技术(服务器与服务器之间的通信)

对称密码技术:发件人和收件人使用其共同拥有的单个密钥 ,这种密钥既用于加密,也用于解密,叫做机密密钥(也称为对称密钥或会话密钥)。能够提供信息机密性(没有密钥信息不能被解密)、完整性(被改变的信息不能被解密)的服务。 对称式密码学又称:单钥密码学、秘密密钥密码学、会话密钥密码学、私钥密码学、共享秘钥密码学

常见的对称式加密技术

 DES(数据加密标准):分组式加密,算法源于Lucifer,作为NIST对称式加密标准;64位(有效位56位、校验8位),分组算法

 3DES:128位,分组算法

 IDEA(国际数据加密算法):128位,比DES快,分组算法

  Blowfish:32-448位,算法公开,分组算法

  RC4:流密码,密钥长度可变

  RC5:分组密码,密钥长度可变,最大2048位

  Rijndael:128位/196位/256位

 AES(高级加密标准):DES升级版,算法出自Rinjindael

 

如上图所示对称加密,用的是同一个密钥,进行加密,解密的操作。

 
  1. // 1.配置密钥

  2.  
  3. private static String PASSWORD = "110";

  4.  
  5. public static void main(String[] args) throws Exception {

  6.  
  7. // 2.需要加密的内容

  8.  
  9. String content = "你好";

  10.  
  11. // 3.使用DES 加密

  12.  
  13. byte[] encryptContent = DES.encrypt(content.getBytes(), PASSWORD);

  14.  
  15. System.out.println("加密后内容:" + new String(encryptContent));

  16.  
  17. // 4.使用DES 解密

  18.  
  19. byte[] decrypt = DES.decrypt(encryptContent, PASSWORD);

  20.  
  21. System.out.println("解密后内容:" + new String(decrypt));

  22.  
  23. }

 

如上图所示,类似这样的代码,既可以通过110来对信息进行加密,又可以用110来对应该进行解密。如上其实这里不限定加密,解密的方式。关键在于密钥都是110.也就是说,通信的双方都是通过这个约定好的密钥来进行数据的加密传输的。

六 非对称加密(客户端与服务器之间的通信)

使用一对密钥:一个用于加密信息,另一个则用于解密信息。

两个密钥之间存在着相互依存关系:即用其中任一个密钥加密的信息只能用另一个密钥进行解密。其中加密密钥不同于解密密钥,公钥加密私钥解密,反之也可私钥加密公钥解密。密钥依据性质划分,将其中的一个向外界公开,称为公钥;另一个则自己保留,称为私钥。

公钥(Public key)常用于数据加密(用对方公钥加密)或签名验证(用对方公钥解密),私钥(Private key)常用于数据解密(发送方用接收方公钥加密)或数字签名(用自己私钥加密)。

机密性、完整性、抗抵赖性

 

具体的流程就是甲乙双方互换公钥。各自通过用对方的公钥来对信息进行加密。然后各自通过自己的私钥,来对对方用公钥加密的信息进行解密。这就是非对称加密的传输过程。常用的加密算法RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。 

 
  1.  
  2. // 公钥加密

  3.  
  4. String textsr = "你好";

  5.  
  6. String cipherText = RSAUtil.encryptByPublicKey(textsr, RSAUtil.publicKey, Cipher.ENCRYPT_MODE);

  7.  
  8. System.out.println("接收方用公钥加密后:" + cipherText);

  9.  
  10. // 私钥解密

  11.  
  12. String text = RSAUtil.encryptByprivateKey(cipherText, RSAUtil.privateKey, Cipher.DECRYPT_MODE);

  13.  
  14. System.out.print("发送方用私钥解密后:" + text);

如上代码片段所示,加密,解密都是通过各自的密钥来的。

 

七 令牌换取数据

通过在后端进行数据加密传输。然后把要进行传输的数据,先送到服务器端做预操作,在服务器端生成操作数据的令牌。返回给客户端。当客户端做了数据造作确认时,从缓存中取出预操作的数据,在服务器端比对令牌,对数据进行操作。

如上图所示就是令牌的数据交换过程。这样就可以防止通过客户端进行传输。不过先别急,这里也许你无法理解上面的过程。这里要先说明,他也许是同一台机器生的服务。在做这个操作的时候。我们进量用来控制核心数据。或者涉及到钱的数据。比如用户下了一个订单。订单是不涉及支付的。那我们后台可以先为这个数据生成一个支付令牌。返回支付金额与支付令牌给用户输入密码确。这个时候我们不把确认的支付金额再传到服务器端保存了。而是把输入密码确认以后的令牌带还来。取出服务器端缓存中的金额进行保存入库。这就防止了抓包,篡改金额数据的风险。总的一句话,核心数据确认入库,不再通过数据本身,而是把数据本身放到缓存预入库。生成对应的令牌到客户端。等用户确认以后做令牌比对,把数据入库。

 

八 Https协议

 

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),简单来讲就是加了安全的HTTP,即HTTP+SSL;我们知道HTTP通讯时,如果客户端C请求服务器S,那么可以通过网络抓包的形式来获取信息,甚至可以模拟服务器S端,来骗取与C端的通讯信息;这对互联网应用在安全领域的推广非常不利;HTTPS解决了这个问题。

8.1什么是SSL协议

安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。

SSL是Netscape于1994年开发的,后来成为了世界上最著名的web安全机制,所有主要的浏览器都支持SSL协议

目前有三个版本:2、3、3.1,最常用的是第3版,是1995年发布的。

SSL协议的三个特性

① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。

② 鉴别:可选的客户端认证,和强制的服务器端认证。

③ 完整性:传送的消息包括消息完整性检查(使用MAC)。

8.2 Https与Http区别

1)HTTPS的服务器需要到CA申请证书,以证明自己服务器的用途;

2)HTTP信息是明文传输,HTTPS信息是密文传输;

3)HTTP与HTTPS的端口不同,一个是80端口,一个是443端口;

可以说HTTP与HTTPS是完全不同的连接方式,HTTPS集合了加密传输,身份认证,更加的安全。

在微信小程序里面都限制只能有https协议、搜索引擎排名都对https优先收录

 

8.3 https加密原理

1)客户端请求服务器,发送握手消息

2)服务器返回客户端自己的加密算法、数字证书和公钥;

3)客户端验证服务器端发送来的数字证书是否与本地受信任的证书相关信息一致;如果不一致则客户端浏览器提示证书不安全.如果验证通过,则浏览器会采用自身的随机数算法产生一个随机数,并用服务器发送来的公钥加密;发送给服务器;这里如果有人通过攻击获取了这个消息,那也没用,因为他没有解密此段消息所需要私钥;验证通过的网站在浏览器地址栏的右边会有一安全锁的标识;

4)服务器解密得到此随机数,并用此随机数作为密钥采用对称加密算法加密一段握手消息发送给浏览器;

5)浏览器收到消息后解密成功,则握手结束,后续的信息都通过此随机密钥加密传输。

以上是服务端认证的情况,如果服务端对访问的客户端也有认证需求,则客户端也需要将自己的证书发送给服务器,服务器认证不通过,通讯结束;原理同上;

另外,一般在传输过程中为了防止消息窜改,还会采用消息摘要后再加密的方式,以此保证消息传递的正确性

  1. 整个过程采用了非对称加密与对称加密技术。非对称加密把对称加密密钥,发送给服务器端。服务器端通过客户端发过来的对称加密密钥,传送要加密的消息。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值