聊聊常见的加密与JWT

一、加密算法/编码

常见的:

    md5(大多数网站已经开始加盐)
    
    SHA-1、2、256等(与md5同属于哈希算法)
    
    AES(加密模式、填充、数据库、密码、偏移量),可选以上5种方法对内容进行加密,且输出可以选base64与hex(16进制)两种。

        假设一串特殊的base64解码(密文中存在“ +/= ”)之后发现是一些乱码,这串密文大概率是AES进行加密的

        其破解来说,除了“密码”与”偏移量“难搞,另外3种相关好碰撞(常见于CTF),正在陆续取代md5。 

    DES(与base64相似,但是在密文之中会出现“ / ”字符) 

二、JWT:

2.1 概念:

  一个用于替代session机制的产物,用于对用户的身份做检验。
	
  全称JSON Web Token(JSON Web令牌)。
      
  JWT不加密传输的数据,但是可以通过数字签名来防止数据被篡改,客户端与服务器的具体交互如下:

        ~用户输入正确的账户密码上传服务器,

        ~通过认证之后,服务器将一串证明身份的字符返回用户端,即JWT

        ~之后用户所有需要认证身份的数据包都携带着JWT去请求,作用十分类似cookie
        

需要注意的一点是,

 	
 	一般JWT字符串都是保存在header之中而非cookie之中(当然可以存在cookie中)。

	这就使得其可以天然防御csrf攻击,但是无法抵挡XSS攻击。
	

2.2 确认网站使用JWT:

  
   ~关键字 “ Authorization ”

   ~数据包格式(XXX.XXX.XXX)
   

2.3 实际例子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

2.4 结构(三部分):

   
    头部(base64编码)、数据(base64编码)、签名((头部+数据+一个秘钥)加密得到)

     	//由上述看出,一个强秘钥(类似强口令)对JWT的安全来说十分重要。
     	

举个例子:

	
    头部内容:

        {
    
    
        "alg": "HS256",       、、加密算法,常见的如HS256
        "typ": "JWT"          、、可有可无的字段
        }

    数据:
  
      {
    
    
        "user_id": "666",         、、当前用户的编号
        "admin": "false",         、、当前用户不是管理员 
        "iat": 1516239022         、、时间戳
      }

2.5 攻击思路:

  
  ~第一种:

        正常的JWT:   AAA.BBB.CCC   

        我们可以先base64还原 AAA.BBB 之后,修改完毕在base64编码成为 XXX.YYY .

                、、这里注意,假设编译的xxx.yyy中含有“=”直接去掉即可。

        最终上传“ XXX.YYY. ”到服务器,直接干掉签名部分,这样假设服务器对签名不进行校验,

        即可达成越权的目的。
        	
        	
       	注意的是,假设可以使用这种方式绕过身份验证,可以尝试在AAA.BBB中sql注入、XSS等等
	
		
				XXX是base64编码后的:
						
						{
    
    
						     "alg": "none",        
						}
				YYY是base64编码后的:
					
						{
    
    
						  "user_id": "666",         
						  "admin": "true",         
						  "iat": 1516239022         
						}

  ~第二种:

        直接使用脚本爆破JWT的秘钥,直接谷歌/百度即可,或者在GitHub上搜索
  
  ~第三种:
  		
  		在一些日志文件中得到JWT,直接使用可能提示失效,
		
		可以试着修改其对应的时间戳,即失效时间。(配合前两种情况)
          

2.6 其他:

 
  ~遇到类似字符串的时候,可以复制粘贴到这个网站看看:
	
			 https://jwt.io/
    

  ~可以通过对JWT进行二次加密或者魔改来达到提高其安全性的目的
  

Guess you like

Origin blog.csdn.net/weixin_43970718/article/details/120538109