HTTP Basic Authorization身份认证模式,抢先认证HttpClient 4.5.3 实例

Basic认证

关于HTTP BASIC认证

Basic 认证是服务器与客户端之间进行认证的一种方式,最初是在HTTP 1.0 规范(RFC 1945)中定义,后续的有关安全的信息可以在HTTP 1.1规范(RFC 2616)和HTTP认证规范(RFC 2617)中找到。HTTP Basic Authentication认证的服务,需要提供用户名和密码,否则服务器就会返回401。

HTTP BASIC认证流程原理

HTTP使用BASIC认证的原理是在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份认证的方法。
实现方法:当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码, 用户输入后,客户端将用户名和密码中间用“:”分隔合并,并将合并后的字符串用BASE64编码,在每次请求数据 时,将密文附加于请求头(Request Header)Authorization: Basic XXXXXXX中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64编码的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

JAVA HttpClient 4.5.3 抢先认证实例

原HttpClient 4.1.1 实例方法DefaultHttpClient等已过时废弃, 如下测试实例中,实现了两种方法:
1)通过HttpClient提供的抢先认证方式,直接跳过验证是否登录,把Basic Authorization信息发送给服务器
2)直接添加header的方式,HttpClient抢先认证方式原理同理

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Base64;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
public class HttpsClientTest {

	@Test
	public void test_auth_basic_should_success() throws Exception {
		String url ="http://192.168.1.100:8080/bywei/api/authtest";
		HttpHost targetHost = new HttpHost("192.168.1.100", 8080, "http");
		HttpGet get = new HttpGet(url);
		UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("test-auth", "=^ad.*sa:_2_RXa*23");
		
		// 使用 AuthCache 方式将使用RestClient 中的 MainClientExec方法,在发送请求时直接携带Authorization header信息
    	       AuthCache authCache = new BasicAuthCache();
    	       // Generate BASIC scheme object and add it to the local auth cache
    	      BasicScheme basicAuth = new BasicScheme();
    	      authCache.put(targetHost, basicAuth);
    	      // Add AuthCache to the execution context
    	      BasicHttpContext localcontext = new BasicHttpContext();
    	      localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
		
		String content = doExecute(get, targetHost, credentials, localcontext);
		System.out.println("Authorization Basic认证authCache请求响应:"+content);
	}
	
	@Test
	public void test_auth_header_should_success() throws Exception {
		String url ="http://192.168.1.100:8080/bywei/api/authtest";
		HttpHost targetHost = new HttpHost("192.168.1.100", 8080, "http");
		HttpGet get = new HttpGet(url);
		String token = "test-auth:=^ad.*sa:_2_RXa*23";
		byte[] auth = Base64.getEncoder().encode(token.getBytes("UTF-8"));
		get.addHeader("Authorization", "Basic " + new String(auth));
		HttpClientContext context = HttpClientContext.create();
		String content = doExecute(get, targetHost, null, context);
		System.out.println("Authorization Basic认证header请求响应:"+content);
	}
	
	private CloseableHttpClient getHttpClient(UsernamePasswordCredentials credentials){
	    RequestConfig requestConf = RequestConfig.custom().setAuthenticationEnabled(false).build();
	    HttpClientBuilder httpClientBuilder = HttpClients.custom();
	    if(credentials != null) {
	    	CredentialsProvider provider = new BasicCredentialsProvider();
	    	provider.setCredentials(AuthScope.ANY, credentials);
	    	httpClientBuilder.setDefaultCredentialsProvider(provider);
	    }
	    CloseableHttpClient client = httpClientBuilder.setDefaultRequestConfig(requestConf).build();
	    return  client;
	}
	
	private String doExecute(HttpGet get, HttpHost targetHost, UsernamePasswordCredentials credentials, HttpContext contenxt) throws Exception {
		CloseableHttpResponse response = null;
		String content = "";
        try {
        	
        	//指定Client使用HttpContext,包含属性:http.auth.auth-cache
            response = getHttpClient(credentials).execute(get, contenxt);
            HttpEntity entity = response.getEntity();
            if(entity!=null) {
                Charset charset = ContentType.getOrDefault(entity).getCharset();
                content = EntityUtils.toString(entity, charset);
                EntityUtils.consume(entity);
                return content;
            }
        } catch(Exception ie) {
            ie.printStackTrace();
            throw ie;
        } finally {
            try {
                if(response!=null) {
                    response.close();
                }
            } catch(IOException e) {
            }
            if(get!=null) {
            	get.releaseConnection();
            } 
        }
        return content;
	}
}

震惊!只有两岁的宝宝,造就了神级编程大师?!!

导读:网络安全知识:网络安全的预防与应对

图片来源 / 网络

现在两三岁的宝宝,经常接触电脑、手机进行上网浏览各种类型的内容。上图已经很直观表现了青少年上网的各种威胁。以此警醒广大家长,加强针对儿童的上网的监督管理,控制孩子上网时间。

小编也是一位三岁小公主的dady, 小公主每天吵着要看小猪佩奇、光头强,抱着好dady的态度,照顾到宝宝的每一个需求,于是就细心研究一番儿童们使用网络的情况。

      查阅相关资料如下

保护我们明亮的眼睛

儿童上网,家长们总是担心宝宝上网时间,浏览内容,损害眼睛的问题。如何正确使用,爸爸、妈妈、小朋友们,要仔细听好,认真执行哦!

  1. 切勿长时间连续上网,尤其不要熬夜上网;
  2. 操作过程中常闭上眼睛休息片刻,或经常眨眼,增加泪液分泌,以缓解眼睛疲劳;
  3. 每隔一小时,要将视线彻底离开电脑休息10分钟;
  4. 室内光照要适中,不可过亮或过暗,一般来说,室内光线应为屏幕明亮度的3倍;
  5. 避免灯光、日光等光源直接照射屏幕,以免产生干扰光线;
  6. 注意调节电脑屏幕的亮度和对比度,屏幕不要太亮,对比度不要太强;
  7. 屏幕刷新频率不小于60赫兹;
  8. 电脑屏幕的中心位置应与操作者胸部在同一水平线上,使屏幕中心在眼睛下方7-10°之间;
  9. 双眼直视屏幕,不要斜视或扭转,眼睛距离35厘米大的屏幕应不少于60厘米,距离38厘米大的屏幕应不少于70厘米;
  10. 要经常擦拭屏幕,避免屏幕过脏使图像模糊,造成眼睛疲劳。

要确保我们的肌肉和骨骼健壮

  1. 正面面对电脑,不要歪坐或扭转;
  2. 坐姿正确,背部要有完全的支撑,膝盖约弯曲90度,应有足够的空间伸放双脚,不要交叉双脚,以免影响血液循环;
  3. 身体不要与桌子靠得太近,肘部保持自然弯曲;
  4. 敲击键盘不要过分用力,肌肉尽量放松;
  5. 不要连续操作,每隔一小时,起来活动全身;
  6. 上网过程中也要时不时伸伸懒腰,舒展筋骨或仰靠在椅子上,双手用力向后伸展;
  7. 还可做抖手指运动,这是完全放松手指最简单的方法。

保护呼吸系统,防止病从“鼻”入

  1. 上网时要注意屋内空气流通,不要在密闭环境中使用电脑;
  2. 有空调的房间应定期进行室内空气消毒;
  3. 在冬季等气候寒冷不利于开窗通风的季节,更要注意更换室内空气。
保持心理健康,快乐上网
  1. 生活要规律,不要因为上网耽误吃饭、睡觉;
  2. 不要在睡前玩过于刺激、紧张的游戏,以免影响入睡速度和睡眠质量;
  3. 要牢记网络世界与现实世界的区别,不要把网络世界当成逃避现实困难的避风港;
  4. 注意培养多种兴趣爱好,丰富业余生活;
  5. 积极参加社交活动,培养良好的人际关系;
  6. 经常进行户外活动,确保脑力消耗与体力消耗的平衡;
  7. 生活中遇到不开心的事或者有不愉快的经历,要及时疏导,不要在网上发泄不良情绪。
网络安全知识:网络安全的预防与应对

其实要让儿童健康上网,也没那么复杂,小编专门针对家里小公主开发了360度上网控制软件《绿盾安全桌面》限制孩子上网时间,守护小朋友健康成长。儿童桌面分享给各位宝爸、宝妈们~~!

 (绿盾安全桌面,守护宝宝健康成长)

API接口防恶意调用盗链或攻击方案

Web前后分离开发,防止API接口被恶意调用或攻击。度娘分享了很多种应对场景的方法。总结得比较好的见文章《前后端分离,如何防止API接口被恶意调用或攻击》、《如何防止别人恶意调用API接口》。
网络安全
本文选用了另外一种常见的配置下载防盗链机制的方法,使用该方式前请仔细阅读《彻底搞清referrer和origin》后,理解应用场景。具体操作记录如下:

  1. 增加Nginx端配置,使其能够获取到Http头信息Origin、Referer。
    proxy_set_header Origin $http_origin;
    proxy_set_header Referer $http_referer;
    
  2. 后端Java来源验证
    public static boolean originAuth(HttpServletRequest request) {
            String referer = request.getHeader("Referer");
            String origin = request.getHeader("Origin");
            String sitePart = request.getServerName();
            if(referer == null || origin == null) {
                return false;
            }
            if (referer != null && !referer.contains(sitePart)) {
                return false;
            }
            if (origin != null && !origin.contains(sitePart)) {
                return false;
            }
            return true;
        }
    

因Http协议是无状态的,针对上面的方法也不是完全无破解方案,只是提高了攻击者的难度。在这条接口网络安全的道路上还得持续的斗智斗勇。