国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何才能保證JWT安全

Android編程精選 ? 來源:CSDN博客 ? 作者:J_小浩子 ? 2021-09-29 15:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

jwt是什么?

JWTs是JSON對象的編碼表示。JSON對象由零或多個名稱/值對組成,其中名稱為字符串,值為任意JSON值。JWT有助于在clear(例如在URL中)發送這樣的信息,可以被信任為不可讀(即加密的)、不可修改的(即簽名)和URL - safe(即Base64編碼的)。

jwt的組成

Header: 標題包含了令牌的元數據,并且在最小包含簽名和/或加密算法的類型

Claims: Claims包含您想要簽署的任何信息

JSON Web Signature (JWS): 在header中指定的使用該算法的數字簽名和聲明

例如:

Header:

{

“alg”: “HS256”,

“typ”: “JWT”

}

Claims:

{

sub”: “1234567890”,

“name”: “John Doe”,

“admin”: true

}

Signature:

base64UrlEncode(Header) + “。” + base64UrlEncode(Claims),

加密生成的token:

如何保證 JWT 安全

有很多庫可以幫助您創建和驗證JWT,但是當使用JWT時,仍然可以做一些事情來限制您的安全風險。在您信任JWT中的任何信息之前,請始終驗證簽名。這應該是給定的。

換句話說,如果您正在傳遞一個秘密簽名密鑰到驗證簽名的方法,并且簽名算法被設置為“none”,那么它應該失敗驗證。

確保簽名的秘密簽名,用于計算和驗證簽名。秘密簽名密鑰只能由發行者和消費者訪問,不能在這兩方之外訪問。

不要在JWT中包含任何敏感數據。這些令牌通常是用來防止操作(未加密)的,因此索賠中的數據可以很容易地解碼和讀取。

如果您擔心重播攻擊,包括一個nonce(jti索賠)、過期時間(exp索賠)和創建時間(iat索賠)。這些在JWT規范中定義得很好。

jwt的框架:JJWT

JJWT是一個提供端到端的JWT創建和驗證的Java庫。永遠免費和開源(Apache License,版本2.0),JJWT很容易使用和理解。它被設計成一個以建筑為中心的流暢界面,隱藏了它的大部分復雜性。

JJWT的目標是最容易使用和理解用于在JVM上創建和驗證JSON Web令牌(JWTs)的庫。

JJWT是基于JWT、JWS、JWE、JWK和JWA RFC規范的Java實現。

JJWT還添加了一些不屬于規范的便利擴展,比如JWT壓縮和索賠強制。

規范兼容:

創建和解析明文壓縮JWTs

創建、解析和驗證所有標準JWS算法的數字簽名緊湊JWTs(又稱JWSs):

HS256: HMAC using SHA-256

HS384: HMAC using SHA-384

HS512: HMAC using SHA-512

RS256: RSASSA-PKCS-v1_5 using SHA-256

RS384: RSASSA-PKCS-v1_5 using SHA-384

RS512: RSASSA-PKCS-v1_5 using SHA-512

PS256: RSASSA-PSS using SHA-256 and MGF1 with SHA-256

PS384: RSASSA-PSS using SHA-384 and MGF1 with SHA-384

PS512: RSASSA-PSS using SHA-512 and MGF1 with SHA-512

ES256: ECDSA using P-256 and SHA-256

ES384: ECDSA using P-384 and SHA-384

ES512: ECDSA using P-521 and SHA-512

這里以github上的demo演示,理解原理,集成到自己項目中即可。

應用采用 spring boot + angular + jwt

結構圖

Maven 引進 : pom.xml

《project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”》

《modelVersion》4.0.0《/modelVersion》

《groupId》com.nibado.example《/groupId》

《artifactId》jwt-angular-spring《/artifactId》

《version》0.0.2-SNAPSHOT《/version》

《properties》

《maven.compiler.source》1.8《/maven.compiler.source》

《maven.compiler.target》1.8《/maven.compiler.target》

《commons.io.version》2.4《/commons.io.version》

《jjwt.version》0.6.0《/jjwt.version》

《junit.version》4.12《/junit.version》

《spring.boot.version》1.5.3.RELEASE《/spring.boot.version》

《/properties》

《build》

《plugins》

《plugin》

《groupId》org.springframework.boot《/groupId》

《artifactId》spring-boot-maven-plugin《/artifactId》

《version》${spring.boot.version}《/version》

《executions》

《execution》

《goals》

《goal》repackage《/goal》

《/goals》

《/execution》

《/executions》

《/plugin》

《/plugins》

《/build》

《dependencies》

《dependency》

《groupId》org.springframework.boot《/groupId》

《artifactId》spring-boot-starter-web《/artifactId》

《version》${spring.boot.version}《/version》

《/dependency》

《dependency》

《groupId》commons-io《/groupId》

《artifactId》commons-io《/artifactId》

《version》${commons.io.version}《/version》

《/dependency》

《dependency》

《groupId》io.jsonwebtoken《/groupId》

《artifactId》jjwt《/artifactId》

《version》${jjwt.version}《/version》

《/dependency》

《dependency》

《groupId》junit《/groupId》

《artifactId》junit《/artifactId》

《version》${junit.version}《/version》

《/dependency》

《/dependencies》《/project》

WebApplication.java

package com.nibado.example.jwtangspr;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

import org.springframework.boot.web.servlet.FilterRegistrationBean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

@EnableAutoConfiguration@ComponentScan@Configurationpublic class WebApplication {

//過濾器

@Bean

public FilterRegistrationBean jwtFilter() {

final FilterRegistrationBean registrationBean = new FilterRegistrationBean();

registrationBean.setFilter(new JwtFilter());

registrationBean.addUrlPatterns(“/api/*”);

return registrationBean;

}

public static void main(final String[] args) throws Exception {

SpringApplication.run(WebApplication.class, args);

}

}

JwtFilter.java

package com.nibado.example.jwtangspr;

import java.io.IOException;

import javax.servlet.FilterChain;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.filter.GenericFilterBean;

import io.jsonwebtoken.Claims;

import io.jsonwebtoken.Jwts;

import io.jsonwebtoken.SignatureException;

public class JwtFilter extends GenericFilterBean {

@Override

public void doFilter(final ServletRequest req,

final ServletResponse res,

final FilterChain chain) throws IOException, ServletException {

final HttpServletRequest request = (HttpServletRequest) req;

//客戶端將token封裝在請求頭中,格式為(Bearer后加空格):Authorization:Bearer +token

final String authHeader = request.getHeader(“Authorization”);

if (authHeader == null || !authHeader.startsWith(“Bearer ”)) {

throw new ServletException(“Missing or invalid Authorization header.”);

}

//去除Bearer 后部分

final String token = authHeader.substring(7);

try {

//解密token,拿到里面的對象claims

final Claims claims = Jwts.parser().setSigningKey(“secretkey”)

.parseClaimsJws(token).getBody();

//將對象傳遞給下一個請求

request.setAttribute(“claims”, claims);

}

catch (final SignatureException e) {

throw new ServletException(“Invalid token.”);

}

chain.doFilter(req, res);

}

}

UserController.java

package com.nibado.example.jwtangspr;

import java.util.Arrays;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.servlet.ServletException;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import io.jsonwebtoken.Jwts;

import io.jsonwebtoken.SignatureAlgorithm;

@RestController@RequestMapping(“/user”)

public class UserController {

//這里模擬數據庫

private final Map《String, List《String》》 userDb = new HashMap《》();

@SuppressWarnings(“unused”)

private static class UserLogin {

public String name;

public String password;

}

public UserController() {

userDb.put(“tom”, Arrays.asList(“user”));

userDb.put(“wen”, Arrays.asList(“user”, “admin”));

}

/*以上是模擬數據庫,并往數據庫插入tom和sally兩條記錄*/

@RequestMapping(value = “login”, method = RequestMethod.POST)

public LoginResponse login(@RequestBody final UserLogin login)

throws ServletException {

if (login.name == null || !userDb.containsKey(login.name)) {

throw new ServletException(“Invalid login”);

}

//加密生成token

return new LoginResponse(Jwts.builder().setSubject(login.name)

.claim(“roles”, userDb.get(login.name)).setIssuedAt(new Date())

.signWith(SignatureAlgorithm.HS256, “secretkey”).compact());

}

@SuppressWarnings(“unused”)

private static class LoginResponse {

public String token;

public LoginResponse(final String token) {

this.token = token;

}

}

}

ApiController.java

package com.nibado.example.jwtangspr;

import io.jsonwebtoken.Claims;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

@RestController@RequestMapping(“/api”)

public class ApiController {

@SuppressWarnings(“unchecked”)

@RequestMapping(value = “role/{role}”, method = RequestMethod.GET)

public Boolean login(@PathVariable final String role,

final HttpServletRequest request) throws ServletException {

final Claims claims = (Claims) request.getAttribute(“claims”);

return ((List《String》) claims.get(“roles”)).contains(role);

}

}

index.html

《!doctype html》《html ng-app=“myApp”》《head》

《meta charset=“utf-8”/》

《meta http-equiv=“X-UA-Compatible” content=“IE=edge,chrome=1”/》

《title》JSON Web Token / AngularJS / Spring Boot example《/title》

《meta name=“description” content=“”》

《meta name=“viewport” content=“width=device-width”》

《link rel=“stylesheet” href=“libs/bootstrap/css/bootstrap.css”》

《script src=“libs/jquery/jquery.js”》《/script》

《script src=“libs/bootstrap/js/bootstrap.js”》《/script》

《script src=“libs/angular/angular.js”》《/script》

《script src=“app.js”》《/script》《/head》《body》《div class=“container” ng-controller=‘MainCtrl’》

《h1》{{greeting}}《/h1》

《div ng-show=“!loggedIn()”》

Please log in (tom and sally are valid names)《/br》

《form ng-submit=“login()”》

Username: 《input type=“text” ng-model=“userName”/》《span》《input type=“submit” value=“Login”/》

《/form》

《/div》

《div class=“alert alert-danger” role=“alert” ng-show=“error.data.message”》

《span class=“glyphicon glyphicon-exclamation-sign” aria-hidden=“true”》《/span》

《span class=“sr-only”》Error:《/span》

{{error.data.message}}

《/div》

《div ng-show=“loggedIn()”》

《div class=“row”》

《div class=“col-md-6”》

《h3》《span class=“label label-success”》Success!《/span》 Welcome {{userName}}《/h3》

《a href ng-click=“logout()”》(logout)《/a》

《/div》

《div class=“col-md-4”》

《div class=“row header”》

《div class=“col-sm-4”》{{userName}} is a《/div》

《/div》

《div class=“row”》

《div class=“col-sm-2”》User《/div》

《div class=“col-sm-2”》《span class=“glyphicon glyphicon-ok” aria-hidden=“true” ng-show=“roleUser”》《/span》《/div》

《/div》

《div class=“row”》

《div class=“col-sm-2”》Admin《/div》

《div class=“col-sm-2”》《span class=“glyphicon glyphicon-ok” aria-hidden=“true” ng-show=“roleAdmin”》《/span》《/div》

《/div》

《div class=“row”》

《div class=“col-sm-2”》Foo《/div》

《div class=“col-sm-2”》《span class=“glyphicon glyphicon-ok” aria-hidden=“true” ng-show=“roleFoo”》《/span》《/div》

《/div》

《/div》

《/div》

《/div》《/div》《/body》《/html》

app.js

var appModule = angular.module(‘myApp’, []);

appModule.controller(‘MainCtrl’, [‘mainService’,‘$scope’,‘$http’,

function(mainService, $scope, $http) {

$scope.greeting = ‘Welcome to the JSON Web Token / AngularJR / Spring example!’;

$scope.token = null;

$scope.error = null;

$scope.roleUser = false;

$scope.roleAdmin = false;

$scope.roleFoo = false;

$scope.login = function() {

$scope.error = null;

mainService.login($scope.userName).then(function(token) {

$scope.token = token;

$http.defaults.headers.common.Authorization = ‘Bearer ’ + token;

$scope.checkRoles();

},

function(error){

$scope.error = error

$scope.userName = ‘’;

});

}

$scope.checkRoles = function() {

mainService.hasRole(‘user’).then(function(user) {$scope.roleUser = user});

mainService.hasRole(‘admin’).then(function(admin) {$scope.roleAdmin = admin});

mainService.hasRole(‘foo’).then(function(foo) {$scope.roleFoo = foo});

}

$scope.logout = function() {

$scope.userName = ‘’;

$scope.token = null;

$http.defaults.headers.common.Authorization = ‘’;

}

$scope.loggedIn = function() {

return $scope.token !== null;

}

} ]);

appModule.service(‘mainService’, function($http) {

return {

login : function(username) {

return $http.post(‘/user/login’, {name: username}).then(function(response) {

return response.data.token;

});

},

hasRole : function(role) {

return $http.get(‘/api/role/’ + role).then(function(response){

console.log(response);

return response.data;

});

}

};

});

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 文件
    +關注

    關注

    1

    文章

    594

    瀏覽量

    26055
  • JSON
    +關注

    關注

    0

    文章

    128

    瀏覽量

    7781

原文標題:還在直接用JWT做鑒權?JJWT真香

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    單片機開發功能安全中編譯器

    期間顯示的防御代碼。僅僅因為在單元測試期間已經實現了防御性代碼的覆蓋范圍,因此并不能保證其已存在于完整的系統中。 在功能安全這個陌生的領域,編譯器可能超出了其要素。這就是為什么目標代碼驗證(OCV
    發表于 12-01 06:44

    芯源半導體安全芯片技術原理

    才能被加載運行。這一機制可以防止惡意固件被植入設備,確保設備從啟動階段就處于安全狀態。安全啟動過程中,采用數字簽名技術,通過驗證固件的簽名來確認固件的來源和完整性。? 物理安全防護:
    發表于 11-13 07:29

    遠程校準電能質量在線監測裝置時,如何保證數據傳輸的安全性?

    在遠程校準電能質量在線監測裝置時,數據安全需覆蓋 傳輸加密、身份認證、權限管控、設備防護、應急響應 等全流程,結合電力行業標準與前沿技術構建立體化防護體系。以下是核心安全保障措施: 一、通信鏈路加
    的頭像 發表于 10-11 16:44 ?676次閱讀

    實施動態校準與補償策略時,如何保證數據的安全性?

    在實施動態校準與補償策略時,數據安全性需覆蓋數據全生命周期(采集→傳輸→存儲→處理→銷毀),重點防范 “數據泄露(如補償模型參數外泄)、數據篡改(如傳感器數據被注入偽造值)、數據丟失(如校準日志損壞
    的頭像 發表于 09-23 18:01 ?683次閱讀

    充電樁測試:守護綠色出行的安全密碼

    而復雜的工程,只有全面覆蓋各個關鍵點,才能打造出安全、可靠、高效的充電設備,為新能源汽車產業的健康發展保駕護航,讓消費者放心暢行于綠色出行之路。
    發表于 09-18 13:52

    如何在保證數據安全的前提下優化通信協議?

    產品實拍圖 在保證數據安全的前提下優化通信協議,核心是 **“安全機制輕量化、安全與效率協同設計、按需適配場景風險”**—— 既不因過度安全
    的頭像 發表于 08-27 09:55 ?725次閱讀
    如何在<b class='flag-5'>保證</b>數據<b class='flag-5'>安全</b>的前提下優化通信協議?

    UPS電源—安裝UPS電源,如何確保電氣安全

    在安裝不間斷電源(UPS)時,嚴格遵守電氣安全規范,防止電氣事故的發生,確保電氣安全至關重要。下面聊一下安裝UPS電源如何保證電氣安全
    的頭像 發表于 08-10 15:15 ?1436次閱讀

    自動駕駛感知系統如何設計才能確保足夠安全

    在自動駕駛技術日益成熟的當下,感知系統的設計與實現已成為確保行車安全的關鍵環節。感知系統不僅承擔著環境信息采集的重任,更決定了整車對突發狀況的應對能力和安全余度。要在豐富多變的真實道路環境中實現
    的頭像 發表于 07-24 18:11 ?973次閱讀

    多線程的安全注意事項

    多線程安全是指多個線程同時訪問或修改共享資源時,能夠保證程序的正確性和可靠性。 開發者選擇TaskPool或Worker進行多線程開發時,在TaskPool和Worker的工作線程中導入的API
    發表于 06-20 07:49

    保障電路安全:穩壓二極管并聯應用技巧

    仔細維護,就能在保證電路正常運行的同時,把電氣設備的安全性提上去,給電子產品的穩定性打個好基礎。選穩壓二極管并聯應用的時候,得根據實際需要調一調、優一優,這樣才能有最好的效果。
    發表于 06-09 13:58

    怎樣才能安全地按住ctrc +c日志閱讀器然后才能停止并重新啟動日志?

    的讀取過程,我將無法在 FX3 中操作任何東西,所有命令都不起作用,所有控件寫入/讀取都將不起作用 以下是兩個函數 我怎樣才能安全地按住 ctrc +c 我的日志閱讀器然后才能停止并重新啟動日志
    發表于 05-27 07:11

    HarmonyOS5云服務技術分享--自有賬號對接AGC認證

    ; 銷戶需確保用戶在??5分鐘內登錄過??,否則需重新認證 ??敏感操作保護?? 修改密碼、重置賬號等操作需二次驗證,提升安全性 ?? ??五、避坑指南?? ??Token有效期??:建議JWT
    發表于 05-22 16:32

    RS485之空調如何保證其更安全高效的防護機制

    RS485之空調如何保證其更安全高效的防護機制
    的頭像 發表于 05-05 16:00 ?1007次閱讀
    RS485之空調如何<b class='flag-5'>保證</b>其更<b class='flag-5'>安全</b>高效的防護機制

    鴻蒙應用元服務開發-Account Kit未成年人模式訂閱和處理用戶信息變更

    事件詳情。具體步驟如下: 1.驗證消息頭中的令牌簽名。 您可通過任何JWT庫(例如:jwt.io)對其進行解析與驗證。 無論使用哪種庫,您均需完成如下操作: 調用接口(https
    發表于 04-16 17:43

    STM32U5如何設置才能保證LPBAM和RUN模式下的應用程序正常使用呢?

    = 0x08000000,LENGTH = 2048K}請問,必須如上圖這樣設置才可以正常使用LPBAM嗎,如果我的應用程序占用RAM過大,需要使用大量的RAM空間,如何設置才能保證LPBAM和RUN模式下的應用程序正常使用呢?
    發表于 03-10 08:21