SpringBoot api 암호 화 구현 예시 코드

SpringBoot 의 API 암호 화 연결
프로젝트 에서 데이터 의 안전 을 확보 하기 위해 저 희 는 전 달 된 데 이 터 를 암호 화 합 니 다.자주 사용 하 는 암호 화 알고리즘 은 대칭 암호 화(AES)와 비대 칭 암호 화(RSA)를 포함 하고 블 로 거들 은 코드 클 라 우 드 에서 가장 간단 한 API 암호 화 항목 을 선택 하여 다음 과 같은 설명 을 한다.
다음은 저희 의 가장 밝 은 아 이 템 을 드 리 겠 습 니 다.
rsa-encrypt-body-spring-boot
프로젝트 소개
이 항목 은 RSA 암호 화 방식 으로 API 인터페이스 에서 되 돌아 오 는 데 이 터 를 암호 화하 여 API 데 이 터 를 더욱 안전하게 합 니 다.다른 사람 은 제 공 된 데 이 터 를 해독 할 수 없다.Spring Boot 인터페이스 암호 화 는 반환 값,매개 변수 값 을 주석 을 통 해 자동 으로 복호화 할 수 있 습 니 다.
RSA 암호 화 란 무엇 입 니까?
우선 저 희 는 당연히 RSA 암호 화 를 알 고 있 습 니 다.
RSA 암호 화 는 비대 칭 암호 화 이다.키 를 직접 전달 하지 않 은 상태 에서 복호화 할 수 있 습 니 다.이것 은 정보의 안전성 을 확보 하고 키 를 직접 전달 하 는 데 발생 하 는 해 결 될 위험 을 피 할 수 있다.한 쌍 의 키 로 복호화 하 는 과정 으로 각각 공개 키 와 비밀 키 라 고 합 니 다.이들 사이 에 수학 과 관련 이 있 는데 이 암호 화 알고리즘 의 원 리 는 바로 큰 정수 에 대해 인수 분해 의 어려움 을 해결 하여 안전성 을 확보 하 는 것 이다.보통 개인 이 비밀 키 를 저장 하고 공개 키 는 공개 적 입 니 다(여러 사람 이 동시에 가지 고 있 을 수 있 습 니 다).
image-20200530133543814
예 를 들다.
암호 화 와 서명 은 모두 안전성 을 고려 한 것 이지 만 약간 다르다.암호 화 와 서명 은 비밀 키 를 사용 하 느 냐,공개 키 를 사용 하 느 냐 는 질문 이 자주 있 습 니 다.사실은 암호 화 와 서명 의 역할 이 헷 갈 리 는 것 이다.쉽게 말 하면 암호 화 는 정보 가 유출 되 는 것 을 방지 하기 위 한 것 이 고 서명 은 정보 가 왜곡 되 는 것 을 방지 하기 위 한 것 이다.여기에 두 가지 예 를 들 어 설명 한다.
첫 번 째 장면:전장에서 B 는 A 에 게 어떤 지령 을 전달 해 야 한다.
RSA 의 암호 화 과정 은 다음 과 같 습 니 다.
(1)A 는 한 쌍 의 키(공개 키 와 비밀 키)를 생 성하 고 비밀 키 는 공개 하지 않 으 며 A 는 스스로 보류한다.공개 키 는 공개 적 으로 누구나 얻 을 수 있 습 니 다.
(2)A 는 자신의 공개 키 를 B 에 게 전달 하고 B 는 A 의 공개 키 로 메 시 지 를 암호 화 한다.
(3)A 는 B 암호 화 된 메 시 지 를 받 고 A 자신의 비밀 키 를 이용 하여 메 시 지 를 복호화 한다.
이 과정 에서 2 차례 전달 과정 만 있 었 고,1 차 는 A 가 B 에 게 공개 키 를 전달 하고,2 차 는 B 가 A 에 게 암호 화 메 시 지 를 전달 해 모두 적 에 게 포 착 됐 더 라 도 위험성 이 없 었 다.A 의 비밀 키 만 이 정 보 를 복호화 해 정보 내용 의 유출 을 막 을 수 있 었 기 때문이다.
**두 번 째 장면:**A 는 B 가 보 낸 메 시 지 를 받 은 후"받 았 습 니 다"라 고 답 해 야 합 니 다.
RSA 서명 과정 은 다음 과 같 습 니 다.
(1)A 는 한 쌍 의 키(공개 키 와 비밀 키)를 생 성하 고 비밀 키 는 공개 하지 않 으 며 A 는 스스로 보류한다.공개 키 는 공개 적 으로 누구나 얻 을 수 있 습 니 다.
(2)A 는 자신의 비밀 키 로 메시지 에 서명 을 하고 서명 을 형성 하 며 추가 한 메시지 와 메시지 자 체 를 함께 B 에 게 전달한다.
(3)B 가 메 시 지 를 받 은 후에 A 의 공개 키 를 가 져 와 검 사 를 하고 검 사 된 내용 이 메시지 자체 와 일치 하면 메시지 가 A 가 답장 한 것 임 을 증명 한다.
이 과정 에서 2 차례 전달 과정 만 있 었 고,1 차 는 A 가 가서명 한 메시지 와 메시지 자 체 를 B 에 게 전달 하고,2 차 는 B 가 A 의 공개 키 를 획득 해 모두 적 에 게 나포 되 더 라 도 위험성 이 없 었 다.A 의 비밀 키 만 이 메시지 에 서명 할 수 있 었 고,메시지 내용 을 알 았 더 라 도 서명 이 있 는 회신 을 B 에 게 위조 해 메시지 내용 변경 을 막 을 수 없 었 기 때문이다.
그러나 두 장면 을 종합해 보면 첫 번 째 장면 은 캡 처 된 정보 가 누설 되 지 않 았 지만 캡 처 한 공개 키 를 이용 하여 가짜 명령 을 암호 화하 여 A 에 게 전달 할 수 있다.두 번 째 장면 에서 캡 처 한 정 보 는 변경 되 지 않 지만 메시지 의 내용 은 공개 키 검 사 를 통 해 얻 을 수 있 고 유출 을 방지 할 수 없다.따라서 실제 응용 에서 상황 에 따라 사용 해 야 하고 암호 화 와 서명 도 동시에 사용 할 수 있다.예 를 들 어 A 와 B 는 모두 자신의 공개 키 와 비밀 키 를 가지 고 있다.A 가 B 에 게 메 시 지 를 보 내 려 고 할 때 먼저 B 의 공개 키 로 메 시 지 를 암호 화 한 다음 에 암호 화 된 메 시 지 를 A 의 비밀 키 로 서명 하면 누설 되 지 않 고 변경 되 지 않 으 며 메시지 의 안전성 을 확보 할 수 있다.
암호 화 실전
블 로 거들,삐걱삐걱 이렇게 많은 데,나 는 RSA 가 무엇 을 하 는 지 이미 알 고 있다.공개 키 암호 화,비밀 키 복호화,비밀 키 서명,공개 키 검사 서명 이 아 닙 니 다.
실전 준비
1.springboot 프로젝트 새로 만 들 기
springboot_api_encryption
2.maven 의 래 도입

<dependency>
    <groupId>cn.shuibo</groupId>
    <artifactId>rsa-encrypt-body-spring-boot</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>
3.시작 클래스 애플 리 케 이 션 에@EnableSecurity 주석 추가

@SpringBootApplication
@EnableSecurity
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
4.application.yml 또는 application.properties 에 RSA 공개 키 와 비밀 키 를 추가 합 니 다.
공개 키 비밀 키 생 성 글 뒤에 생 성 도구 가 나 옵 니 다.

rsa:
  encrypt:
    open: false #        true  or  false
    showLog: true #        log true  or  false
    publicKey: # RSA       
    privateKey: # RSA       
5.Controller 안의 API 방법 을 암호 화 합 니 다.

@Encrypt
@GetMapping("/encryption")
public TestBean encryption(){
    TestBean testBean = new TestBean();
    testBean.setName("shuibo.cn");
    testBean.setAge(18);
    return testBean;
}
6.전 달 된 암호 화 매개 변수 복호화
다른 자바 엔 드 프로그램 은 주 해 를 사용 할 수 있 습 니 다.vue 라면 RSA 키 로 복호화 하 십시오.

@Decrypt
@PostMapping("/decryption")
public String Decryption(@RequestBody TestBean testBean){
    return testBean.toString();
}
진짜 칼 과 진짜 총
1.maven 도입
image-20200530124748690
2.시작 클래스 에 주석 추가
image-20200531001950365
3.YML 설정 키 추가
image-20200530133442181
4.실체 클래스 만 들 기
image-20200530133633008
5.대외 API 인터페이스 작성
image-20200530133633008
6.시작 항목
요청 주소:http://localhost:8080/encryption
우 리 는 돌아 오 는 데이터 가 암호 화 되 지 않 은 것 을 보 았 다.
image-20200530134455948
7.수정
open 을 true 로 변경 하여 암호 화 열기

rsa:
  encrypt:
    open: true #        true  or  false
    showLog: true #        log true  or  false
    publicKey: # RSA       
    privateKey: # RSA       
8.프로젝트 재 부팅
요청 주소:http://localhost:8080/encryption
우 리 는 돌아 온 데이터 가 암호 화 된 것 을 보 았 다.
9.암호 화 로그
image-20200530134830477
비밀 해제 실전
다른 spring boot 프로젝트 라면 앞 과 같 습 니 다.클 라 이언 트 가 springboot 프로젝트 라 고 생각 하고 다른 것 은 RSA 복호화 프로 토 콜 을 사용 하여 복호화 하 십시오!
서버 에 개인 키,공공 키 가 있 습 니 다.
프론트 엔 드 는 공개 키 만 있 으 면 됩 니 다.
실전 준비
원래 springboot 에 복호화 방법 을 쓰 세 요.
1.전단 js 복호화 방법

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>
2.백 스테이지 복호화 방법 추가

/**
 *   
 * @param user
 * @return
 */
@PostMapping("/decryption")
@Decrypt
@ResponseBody
public String Decryption(@RequestBody User user){
    System.out.println(user.toString());
    return user.toString();
}
3.js 방법

#  
 var PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAobhGH4WMwMvJRUlTxWrCVIOQtsHijAxPJNvAWAgq80ADpFEWrpbcGB9cKqp6XHRH4k/CVtCUZ7jm9UKwhaeAm18sKtcwe+M8JFNX6FSHpgde0o8C9S/QpcmLxf4iN7nGZ7P3ZTvMdmKUcdRMsVQnsydG2Bj6gRxP2+kexEebTeODbdM7dHlkxAL0RxGWmX/ZOBzsoWZw2gKcC0vxwyIZBGHUdImG2T3nEA+VMfK2Yqv3uSYukmlKP+0mjfhrTtLFDuTV1VER9BfryBMvpQCxLO4pqgZnXPd+SOQcZHZ2OL0wqo5OX1+GPYx7TNxz5Qi76pK//T2mH7s6X/BuyT21HQIDAQAB';

/**
 *     
 * @returns {PromiseLike<ArrayBuffer>}
 * @constructor
 */
function RSA_encryption(jsonData) {
	var encrypt = new JSEncrypt();
	encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
	var encrypted = encrypt.encrypt(JSON.stringify(jsonData));
	console.log('     :%o', str);
	console.log('     :%o', encrypted);
	return encrypted;
}


/**
 *     
 */
function tijiao() {
	var str = {
		"name":"1223334",
		"password":"asd",
		age:1
	};
		$.ajax({
			url: "/decryption",
			type : "POST",
			contentType: "application/json;charset=utf-8",
			data : RSA_encryption(str) ,
			success : function(data) {
				alert(data);
			}
		})
}
진짜 칼 과 진짜 총
1.Controller 복호화 방법 인터페이스 추가
image-20200530155533200
2.전단 페이지 도입 js 및 방법

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
     ,    
<button id="jiami" onclick="tijiao()">     </button>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>
<script>
    var PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAobhGH4WMwMvJRUlTxWrCVIOQtsHijAxPJNvAWAgq80ADpFEWrpbcGB9cKqp6XHRH4k/CVtCUZ7jm9UKwhaeAm18sKtcwe+M8JFNX6FSHpgde0o8C9S/QpcmLxf4iN7nGZ7P3ZTvMdmKUcdRMsVQnsydG2Bj6gRxP2+kexEebTeODbdM7dHlkxAL0RxGWmX/ZOBzsoWZw2gKcC0vxwyIZBGHUdImG2T3nEA+VMfK2Yqv3uSYukmlKP+0mjfhrTtLFDuTV1VER9BfryBMvpQCxLO4pqgZnXPd+SOQcZHZ2OL0wqo5OX1+GPYx7TNxz5Qi76pK//T2mH7s6X/BuyT21HQIDAQAB';

    /**
     *     
     * @returns {PromiseLike<ArrayBuffer>}
     * @constructor
     */
    function RSA_encryption(jsonData) {
        var encrypt = new JSEncrypt();
        encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
        var encrypted = encrypt.encrypt(JSON.stringify(jsonData));
        console.log('     :%o', jsonData);
        console.log('     :%o', encrypted);
        return encrypted;
    }

    /**
     *     
     */
    function tijiao() {
        var str = {
            "name":"1223334",
            "password":"asd",
            age:1
        };
            $.ajax({
                url: "/decryption",
                type : "POST",
                contentType: "application/json;charset=utf-8",
                data : RSA_encryption(str) ,
                success : function(data) {
                    alert(data);
                }
            })
    }


</script>
</body>
</html>
3.접근 시작
http://localhost:8080
image-20200530155844869
4.배경 복호화 로그
image-20200530155844869
총결산
위의 인터페이스 암호 화 복호화 작업 을 거 쳤 습 니 다.우리 의 인터페이스 가 공개 키 가 없 거나 비밀 키 가 없 으 면 다른 사람 이 복호화 할 수 없다 는 것 을 알 수 있 습 니 다!이렇게 하면 API 인터페이스 에 좋 은 보호 역할 을 하여 다른 사람 이 가방 을 잡 는 것 을 방지 합 니 다!
모두:매일 조금씩 배우 고 기술 의 성장 이 빠 르 기 를 바 랍 니 다.
프로젝트 구덩이
이 프로젝트 의 demo 에 접근 할 수 없습니다.어 려 운 점 은 전단 에서 어떻게 암호 화하 여 백 스테이지 로 전송 하여 복호화 하 는 지 입 니 다.이 구 덩이 는 제 가 여러분 을 데 리 고 기어 나 왔 습 니 다!
다음은 아이디어 사항 입 니 다.
1.아이디어 ajax 의 contentType:"application/json;charset=utf-8”

$.ajax({
    url: "/decryption",
    type : "POST",
    contentType: "application/json;charset=utf-8",
    data : RSA_encryption(str) ,
    success : function(data) {
        alert(data);
    }
})
2、복호화 방법 은@RequestBody

@PostMapping("/decryption")
@Decrypt
@ResponseBody
public String Decryption(@RequestBody User user){
    System.out.println(user.toString());
    return user.toString();
}
소스 코드 가 져 오기:
https://github.com/pengziliu/GitHub-code-practice
SpringBoot 가 api 암호 화 를 실현 하 는 예제 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 SpringBoot api 암호 화 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!

좋은 웹페이지 즐겨찾기