亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

使用JWT確保API的安全

jeffrey_up / 3110人閱讀

摘要:下面舉幾個(gè)未經(jīng)保護(hù)的可能將會(huì)造成的安全事故通過(guò)抓包,找到發(fā)送短信驗(yàn)證碼的。這可能將會(huì)直接對(duì)用戶(hù)造成財(cái)產(chǎn)損失。因此,未經(jīng)安全保護(hù)的非常的危險(xiǎn),對(duì)進(jìn)行安全保護(hù)異常重要??梢詫⒄?qǐng)求參數(shù)一并放入中,以此來(lái)確保數(shù)據(jù)的安全性。

未經(jīng)安全保護(hù)的API非常的危險(xiǎn)

未經(jīng)安全保護(hù)的API非常的危險(xiǎn),其和裸奔無(wú)異。即使API文檔沒(méi)有被人為泄露,通過(guò)簡(jiǎn)單的抓包也可以非常容易的獲取到API的URL以及對(duì)應(yīng)的請(qǐng)求參數(shù)。下面舉幾個(gè)未經(jīng)保護(hù)的API可能將會(huì)造成的安全事故:

通過(guò)抓包,找到發(fā)送短信驗(yàn)證碼的API。然后利用該API惡意的發(fā)送短信驗(yàn)證碼。而發(fā)送短信驗(yàn)證碼是需要收費(fèi)的,這樣的惡意攻擊,將會(huì)導(dǎo)致無(wú)故的損失發(fā)送短信的費(fèi)用。還會(huì)讓很多不明真相的吃瓜群眾收到奇怪的短信驗(yàn)證碼,進(jìn)而對(duì)產(chǎn)品產(chǎn)生不好的印象。

通過(guò)抓包,找到獲取用戶(hù)信息的API。該API的暴露,將會(huì)讓該平臺(tái)上所有用戶(hù)的信息被毫無(wú)保留的暴露在互聯(lián)網(wǎng)上。如果用戶(hù)信息中還涉及到一些重要的個(gè)人信息。比如身份證號(hào),手機(jī)號(hào)等。將會(huì)讓用戶(hù)受到人生和財(cái)產(chǎn)的損失。

通過(guò)抓包,找到和財(cái)產(chǎn)相關(guān)的API。比如說(shuō)修改訂單狀態(tài)的API。一旦該API暴露,黑客可以惡意的修改用戶(hù)的訂單狀態(tài)。比如說(shuō)將訂單的狀態(tài)修改為取消。這可能將會(huì)直接對(duì)用戶(hù)造成財(cái)產(chǎn)損失。

上面這些例子僅僅只是筆者臨時(shí)想到的一些利用裸露API進(jìn)行惡意攻擊的方式,實(shí)際中還存在著更多由于未對(duì)API進(jìn)行加密,而造成損失的情況。因此,未經(jīng)安全保護(hù)的API非常的危險(xiǎn),對(duì)API進(jìn)行安全保護(hù)異常重要。

什么是JWT

JWT是json web token的縮寫(xiě)。關(guān)于其如何確保數(shù)據(jù)傳輸?shù)陌踩缘奈恼履憧梢栽谒阉饕嫔险业胶芏?,在這里我將僅僅簡(jiǎn)單介紹我對(duì)此的理解。

JWT可以理解為一串通過(guò)特定算法生成的字符串,在API的請(qǐng)求中,將這段字符串放入請(qǐng)求參數(shù)中。API Server通過(guò)判斷這段字符串是合法的還是偽造的,來(lái)確定這次API請(qǐng)求是否有效。通過(guò)該安全措施,將確保即使API被暴露,沒(méi)有生成JWT字符串的算法,也沒(méi)有辦法成功調(diào)用API。

JWT字符串分為兩個(gè)部分(官方的說(shuō)法是分為3個(gè)部分),分別是‘未加密部分’和‘加密部分’。而‘加密部分’的內(nèi)容實(shí)際上是‘未加密部分’加密得到的。API Server檢查JWT字符串是否有效的第一步是將‘加密部分’解密然后與‘未加密部分’進(jìn)行比較,查看是否內(nèi)容一致。如果內(nèi)容不一致,則說(shuō)明該JWT字符串是偽造的。

JWT字符串中包括一個(gè)‘過(guò)期時(shí)間’的字段,當(dāng)API Server獲取到JWT字符串后,可以通過(guò)檢查該字段與當(dāng)前時(shí)間相比,是否已經(jīng)處于過(guò)期的狀態(tài)。如果‘過(guò)期時(shí)間’字段早于當(dāng)前時(shí)間,則說(shuō)明這次API請(qǐng)求是無(wú)效的。

你也可以在JWT字段種加入自定義的字段。然后在API Server獲取到JWT字段后,通過(guò)這些自定義的字段判斷是不是符合具體的業(yè)務(wù)邏輯,進(jìn)而判斷這次請(qǐng)求是不是有效。

利用jjwt實(shí)現(xiàn)JWT對(duì)API的保護(hù)

jjwtjava對(duì)JWT的封裝,下面的方法將會(huì)演示。在java中如何利用jjwt實(shí)現(xiàn)API的保護(hù)

gradle依賴(lài)
compile "io.jsonwebtoken:jjwt:0.7.0"
生成JWT字符串
public String buildJwt(Date exp) {
    String jwt = Jwts.builder()
            .signWith(SignatureAlgorithm.HS256,SECRET_KEY)//SECRET_KEY是加密算法對(duì)應(yīng)的密鑰,這里使用額是HS256加密算法
            .setExpiration(exp)//expTime是過(guò)期時(shí)間
            .claim("key","vaule")//該方法是在JWT中加入值為vaule的key字段
            .compact();
    return jwt;
}
判斷JWT是否有效
public boolean isJwtValid(String jwt) {
    try {
        //解析JWT字符串中的數(shù)據(jù),并進(jìn)行最基礎(chǔ)的驗(yàn)證
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)//SECRET_KEY是加密算法對(duì)應(yīng)的密鑰,jjwt可以自動(dòng)判斷機(jī)密算法
                .parseClaimsJws(jwt)//jwt是JWT字符串
                .getBody();
        String vaule = claims.get("key", String.class);//獲取自定義字段key
        //判斷自定義字段是否正確
        if ("vaule".equals(vaule)) {
            return true;
        } else {
            return false;
        }
    }
    //在解析JWT字符串時(shí),如果密鑰不正確,將會(huì)解析失敗,拋出SignatureException異常,說(shuō)明該JWT字符串是偽造的
    //在解析JWT字符串時(shí),如果‘過(guò)期時(shí)間字段’已經(jīng)早于當(dāng)前時(shí)間,將會(huì)拋出ExpiredJwtException異常,說(shuō)明本次請(qǐng)求已經(jīng)失效
    catch (SignatureException|ExpiredJwtException e) {
        return false;
    }
}
Client端

Client端需要做的就是,根據(jù)API的需求將JWT字符串放入http請(qǐng)求中。我的做法是對(duì)于所有的API,在Client端生成JWT字段,然后將其添加到http請(qǐng)求的header中,確保所有的API都獲得保護(hù)。對(duì)于一些比較敏感的信息,再用加一層JWT驗(yàn)證。比如說(shuō)用戶(hù)信息,在調(diào)用登錄API后,API Server將會(huì)返回一個(gè)特定的JWT字符串,該JWT字段總將會(huì)包含該用戶(hù)的userId。如果要獲取用戶(hù)信息,除了要將Client端生成的JWT字段放入請(qǐng)求,還需要將該JWT字符串放入請(qǐng)求。接下來(lái)展示一下利用OKHttp在http請(qǐng)求的header中加入JWT字段的代碼:

//該方法將會(huì)在所有請(qǐng)求的header中加入jwt
public Response call(Request request) throws IOException {
    OkHttpClient client = new OkHttpClient();
    Request.Builder requestBuilder = request.newBuilder()
            .addHeader("commonJwt", jwtService.makeJwt());//加入Client本地生成的JWT字符串
    //加入登錄成功后獲取到的JWT字符串
    String userJwt = jwtService.getUserJwt();
    if (!StringUtils.isSpace(userJwt))
        requestBuilder.addHeader("userJwt", userJwt);
    request = requestBuilder.build();
    return client.newCall(request).execute();
}
API Server

API Server端需要做的就是,在收到API請(qǐng)求時(shí),首先檢查client端生成的JWT字段是否有效,然后如果該API涉及敏感信息,則檢查檢測(cè)特定的JWT字段是否有效。接下來(lái)展示一下在spring中利用aop進(jìn)行JWT字段的驗(yàn)證:

@Pointcut("@annotation(org.springframework.web.bind.annotation.ResponseBody)")
public void onCommonAuth(){}

//所有的API都需要驗(yàn)證client生成的JWT字段是否有效
@Order(1)
@Around("onCommonAuth()")
public Object onCommonAuth(ProceedingJoinPoint joinPoint) throws Throwable {
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    String commonJwt = request.getHeader("commonJwt");
    if (jwtService.isCommonJwtValid(commonJwt)) {
        return joinPoint.proceed();
    } else {
        return "沒(méi)有訪(fǎng)問(wèn)該API的權(quán)限";
    }
}

@Pointcut("execution(* com.demo.controller.UserController.getUserInfo(..))")
public void onGetByUserInfo() {}

//對(duì)獲取用戶(hù)信息API,堅(jiān)持userJwt是否有效
@Order(2)
@Around("onGetByUserInfo()&&args(userId,..)")
public Object onGetByUserInfo(ProceedingJoinPoint joinPoint, Long userId) throws Throwable {
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    String userJwt = request.getHeader("userJwt");
    if (jwtService.isUserJwtValid(userJwt, userId)) {
        return joinPoint.proceed();
    } else {
        return "沒(méi)有訪(fǎng)問(wèn)該API的權(quán)限";
    }
}
補(bǔ)充

JWT在一定程度上,保護(hù)了API的安全。但是其本身還是存在一定的缺陷的。比如說(shuō),一定JWT的加密密鑰一旦被泄露,那么黑客就可以生成JWT字符串了,因此保護(hù)好JWT加密密鑰非常重要。

在上面的例子當(dāng)中,介紹了獲取用戶(hù)信息API需要加入userJwt的例子。userJwt其實(shí)就是在JWT字符串中加入了userId字段,繼而保證一個(gè)userJwt只能訪(fǎng)問(wèn)一個(gè)用戶(hù)的信息。對(duì)于其他的API,比如說(shuō)PUT和POST操作,需要新增和修改數(shù)據(jù)的API??梢詫⒄?qǐng)求參數(shù)一并放入jwt中,以此來(lái)確保數(shù)據(jù)的安全性。否則黑客還可以在JWT字符串還沒(méi)有過(guò)期的時(shí)間段內(nèi),修改請(qǐng)求中的參數(shù),達(dá)到攻擊的目的。

另外還要防止重復(fù)式攻擊,黑客還可以在JWT字符串還沒(méi)有過(guò)期的時(shí)間段內(nèi),重復(fù)提交請(qǐng)求,達(dá)到攻擊的目的。比如說(shuō)新增訂單的API,如果被黑客采用重復(fù)式攻擊的方式,就會(huì)生成多個(gè)訂單。

參考

RESTful Api 身份認(rèn)證中的安全性設(shè)計(jì)探討
JSON Web Token - 在Web應(yīng)用間安全地傳遞信息
八幅漫畫(huà)理解使用JSON Web Token設(shè)計(jì)單點(diǎn)登錄系統(tǒng)
How to Create and verify JWTs in Java
jwt官方介紹
jwt官網(wǎng)
jjwt在github上的地址

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66104.html

相關(guān)文章

  • 微服務(wù)實(shí)戰(zhàn):從架構(gòu)到發(fā)布(二)

    摘要:微服務(wù)架構(gòu)著重培養(yǎng)通用可重用的服務(wù)。服務(wù)注冊(cè)和發(fā)現(xiàn)微服務(wù)架構(gòu)下,有大量的微服務(wù)需要處理。網(wǎng)關(guān)也是獲得微服務(wù)狀態(tài)監(jiān)控信息的中心。實(shí)際情況是,微服務(wù)和其它企業(yè)架構(gòu)并存。 引言:上篇文章介紹了微服務(wù)和單體架構(gòu)的區(qū)別、微服務(wù)的設(shè)計(jì)、消息、服務(wù)間通信、數(shù)據(jù)去中心化,本篇會(huì)繼續(xù)深入微服務(wù),介紹其它特性。 治理去中心化 通常治理的意思是構(gòu)建方案,并且迫使人們通過(guò)努力達(dá)到組織的目標(biāo)。SOA治理指導(dǎo)開(kāi)發(fā)...

    JinB 評(píng)論0 收藏0
  • 微服務(wù)實(shí)戰(zhàn):從架構(gòu)到發(fā)布(二)

    摘要:微服務(wù)架構(gòu)著重培養(yǎng)通用可重用的服務(wù)。服務(wù)注冊(cè)和發(fā)現(xiàn)微服務(wù)架構(gòu)下,有大量的微服務(wù)需要處理。網(wǎng)關(guān)也是獲得微服務(wù)狀態(tài)監(jiān)控信息的中心。實(shí)際情況是,微服務(wù)和其它企業(yè)架構(gòu)并存。 引言:上篇文章介紹了微服務(wù)和單體架構(gòu)的區(qū)別、微服務(wù)的設(shè)計(jì)、消息、服務(wù)間通信、數(shù)據(jù)去中心化,本篇會(huì)繼續(xù)深入微服務(wù),介紹其它特性。 治理去中心化 通常治理的意思是構(gòu)建方案,并且迫使人們通過(guò)努力達(dá)到組織的目標(biāo)。SOA治理指導(dǎo)開(kāi)發(fā)...

    zhaot 評(píng)論0 收藏0
  • 微服務(wù)實(shí)戰(zhàn):從架構(gòu)到發(fā)布(二)

    摘要:微服務(wù)架構(gòu)著重培養(yǎng)通用可重用的服務(wù)。服務(wù)注冊(cè)和發(fā)現(xiàn)微服務(wù)架構(gòu)下,有大量的微服務(wù)需要處理。網(wǎng)關(guān)也是獲得微服務(wù)狀態(tài)監(jiān)控信息的中心。實(shí)際情況是,微服務(wù)和其它企業(yè)架構(gòu)并存。 引言:上篇文章介紹了微服務(wù)和單體架構(gòu)的區(qū)別、微服務(wù)的設(shè)計(jì)、消息、服務(wù)間通信、數(shù)據(jù)去中心化,本篇會(huì)繼續(xù)深入微服務(wù),介紹其它特性。 治理去中心化 通常治理的意思是構(gòu)建方案,并且迫使人們通過(guò)努力達(dá)到組織的目標(biāo)。SOA治理指導(dǎo)開(kāi)發(fā)...

    sf190404 評(píng)論0 收藏0
  • 論微服務(wù)安全

    摘要:微服務(wù)能夠?yàn)閼?yīng)用程序設(shè)計(jì)提供一種更具針對(duì)性范圍性與模塊性的實(shí)現(xiàn)方案。安全微服務(wù)部署模式可謂多種多樣但其中使用最為廣泛的當(dāng)數(shù)每主機(jī)服務(wù)模式。在微服務(wù)環(huán)境下,安全性往往成為最大的挑戰(zhàn)。不同微服務(wù)之間可通過(guò)多種方式建立受信關(guān)系。 每個(gè)人都在討論微服務(wù),每個(gè)人也都希望能夠?qū)崿F(xiàn)微服務(wù)架構(gòu),而微服務(wù)安全也日漸成為大家關(guān)注的重要問(wèn)題。今天小數(shù)與大家分享的文章,就從應(yīng)用層面深入探討了應(yīng)對(duì)微服務(wù)安全挑戰(zhàn)...

    plokmju88 評(píng)論0 收藏0
  • Spring Security

    摘要:框架具有輕便,開(kāi)源的優(yōu)點(diǎn),所以本譯見(jiàn)構(gòu)建用戶(hù)管理微服務(wù)五使用令牌和來(lái)實(shí)現(xiàn)身份驗(yàn)證往期譯見(jiàn)系列文章在賬號(hào)分享中持續(xù)連載,敬請(qǐng)查看在往期譯見(jiàn)系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪(fǎng)問(wèn)層和前端控制器但是忽略了對(duì)身份進(jìn)行驗(yàn)證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...

    keelii 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<