[Java 인증-mac,MessageDigest(1)]

【머리말】
            이틀 동안 계속 Open Api 를 썼 는데 Api 는 다 썼 지만 안전 을 위해 서 는 인 터 페 이 스 를 인증 해 야 한다.
[주체]
베이스 64
(1)인 코딩
    public static String encryptBASE64(byte[] key) throws Exception {
        return (new BASE64Encoder()).encodeBuffer(key);
    }

(2)디 코딩
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }

2.메시지 다이제스트
(1)안내
MessageDigest                 , MD5 SHA  ,               ,          ,           。

 (2)절차
(a)대상 초기 화 시작
(b)ipdate 방법 으로 데 이 터 를 처리 합 니 다.
 (c)digest 방법 으로 해시 계산 완료
(3)코드
public class MessageDigestTest {
    static String abc = "zhaoxiaodong";
    public static void main(String[] args) throws Exception{
        //MessageDigest         
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        //    update      
        md5.update(abc.getBytes());
        //  digest        
        System.out.println("md5(abc)="+ Base64Coder.encode(md5.digest()));
        

    }
}

mac
(1)안내
메시지 요약 의 불안정 성 을 고려 하여-원문 을 얻 고 알고리즘 을 알 면 정확 한 메시지 요약 을 얻 을 수 있 습 니 다.사람들 은 키 요 소 를 추가 하여 보안 메시지 요약 인 MAC(Message Authentication Code)을 얻 었 습 니 다.MAC 의 특징 은 원문 만 으로 는 보안 메시지 요약 을 계산 할 수 없다 는 것 이다.쌍방 이 모두 알 고 있 는 메시지 키 가 필요 합 니 다.누 군가 메시지 본 체 를 수정 하고 메시지 요약 을 수 정 했 지만 키 가 없어 데이터 가 파 괴 된 것 으로 밝 혀 져 MAC 를 계산 하 는 방법 은 많 지만 핵심 자바 API 는 관련 이 없다.자바 의 실현 은 주로 JCE 공급 자 를 통 해 이 루어 진다.Mac 클래스 가 메시지 요약 에 대응 하 는 Message Digest 클래스 입 니 다.메시지 요약 을 계산 할 때 키 가 필요 합 니 다.키 관리 가 또 다른 화제 입 니 다.여기 서 주로 MAC 의 알고리즘 을 말 하 는데 JCE 는 주로 HmacSHA 1 과 HmacMD5 를 바탕 으로 한다.구체 적 인 provider 는 어떤 MAC 와 관련 된 알고리즘 을 제 공 했 습 니까?그들 은 비교적 어 떻 습 니까?아래 의 코드 를 보십시오.
(2)절차
(a)getInstance 인 스 턴 스 가 인 스 턴 스 를 받 습 니 다.
  (b)key 와 알고리즘 매개 변 수 를 초기 화 합 니 다.
 (c)업데이트 로 데이터 전송
 (d)doFinal 을 통 해 결 과 를 얻는다.
(3)코드

public class Md5Test {
    static String appId = "zhaoxiaodong";
    static String appKey ="nizhenbang";
    public static String main(String[] args) throws Exception{
        //1、getInstance    
        Mac mac = Mac.getInstance("HmacSHA1");
        //2、  key          
        mac.init(new SecretKeySpec(appId.getBytes("utf-8"),"HmacSHA1"));
        //3、  update      
        //4、  doFinal    
        byte[] signData = mac.doFinal(appKey.getBytes("utf-8"));
        return Base64.encodeBase64String(signData);
    }
}

4.프로젝트 실전
(1)발송 자
package com.openApi;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;

/**
 * @Describe:                    。
 * @Author:    
 * @Date: 17:03 2021-1-22
 * @param:
 * @return:
 */
public class openAPi {
    //           appId
    static String appId = "10037e6f66f2d0f901672aa27d690006";
    static String url ="http://192.168.72.15:61043/app/orderApi/orderClose";

    public static void main(String[] args) throws Exception {
        //      appId      ,          
//        byte[] appIdByte = appId.getBytes("UTF-8");
//        byte[] bytes = DigestUtils.md5(appIdByte);
        //   TenantEntity
        TenantEntity tenantEntity = new TenantEntity();
        tenantEntity.setAccount("15197272363");
        tenantEntity.setCode("1113");
        String tenantJson = JSONObject.toJSONString(tenantEntity);
        //        getOpenBodySig
        String send = send(url, tenantJson);
        System.out.println(send);
//        String openBodySig = getOpenBodySig(appId, tenantJson);
//        System.out.println(openBodySig);
//            Token  ,        url
//        request()


    }
    public static String getOpenBodySig(String appId,String entity) throws Exception{
        //MessageDigest        
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        //    update      
        String encodeBody= appId+entity;
        md5.update(encodeBody.getBytes("utf-8"));
        //  digest        
        String appIdEncode = Base64.encodeBase64String(md5.digest());
        //appId     
//        byte[] bytes = DigestUtils.md5(appId);
        // appId entity      
        //                 ,     token ,        
        System.out.println("------------->"+ appIdEncode);
//        String token = JSONObject.toJSONString(appIdEncode);
        return appIdEncode;
    }
    public static String send(String url,String entity) throws Exception{
        String openBodySig = getOpenBodySig(appId, entity);
        String requestString = request(url, openBodySig, entity);
        return requestString;
    }
    public static String request(String url,String authorization,String entity)throws  Exception{
        String response="";
        PrintWriter out = null;
        BufferedReader in = null;
        try {
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            HttpURLConnection httpURLConnection=(HttpURLConnection)conn;
            httpURLConnection.setRequestProperty("Content-Type","application/json");
            httpURLConnection.setRequestProperty("authorization",authorization);
//            String encodeEntity = (new BASE64Encoder()).encodeBuffer(entity.getBytes());
            httpURLConnection.setRequestProperty("entity",entity);
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            out = new PrintWriter(httpURLConnection.getOutputStream());
            out.write(entity);
            out.flush();
            httpURLConnection.connect();
            in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
            String line;
            while ((line = in.readLine())!=null){
                response +=line;
            }

        } catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if ( out!=null){
                    out.close();
                }
                if (in!=null){
                    in.close();
                }
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
        return  response;
    }

}

(2)검사 자
검사 할 때 바로 차단기 에서 차단 한 다음 에 검 사 를 한다.
       //    Swagger ,      --earnest
        String entity = request.getHeader("entity");
        //    url        ,            ,        
        if(urlMatchUtil.match("/app/orderApi",requestURI) && entity!=null && entity!=""){
            //        ,       code ,  code ,     appId,          。

            // entity    
//            byte[] bytes1 = (new BASE64Decoder()).decodeBuffer(entity);
//            String entityInfo = new String(bytes1);
            TenantEntity tenantEntity = JSON.parseObject(entity, TenantEntity.class);
            //   code 
            String code = tenantEntity.getCode();
            //  code         appId
            String appId = "10037e6f66f2d0f901672aa27d690006";
            //   appId entity,                   
            String appIdEntity = appId + entity;
            //MessageDigest        
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            //    update      
            md5.update(appIdEntity.getBytes("utf-8"));
            //  digest        
            String appIdEncode = Base64.encodeBase64String(md5.digest());
            String authorization = request.getHeader("authorization");
            appIdEncode = new String(appIdEncode.getBytes("ISO-8859-1"),"UTF-8");
            authorization = new String(authorization.getBytes("ISO-8859-1"),"UTF-8");
            System.out.println(appIdEncode);
            System.out.println(authorization);
            if (appIdEncode.trim().equals(authorization.trim())){
                return super.preHandle(request,response,handler);
            }else {
                throw BizException.wrap(R.FAIL_CODE,"     ");
            }
        }

5.프로젝트 실전 최적화
이번 최 적 화 는 요청 실 체 를 암호 화하 고 통일 적 으로 되 돌려 주 는 것 을 최적화 시 켰 습 니 다.요청 헤드 를 따로 추가 하지 않 아 도 됩 니 다.또 하 나 는 시간 스탬프 를 추가 하 는 것 입 니 다.api 에 시간 스탬프 를 추가 하 는 목적 입 니 다.이런 api 는 비동기 요청 이기 때문에 중복 요청 을 방지 하기 위해 호출 순서에 따라 처리 되 고 클 라 이언 트 시간 등 을 정확하게 가 져 와 야 합 니 다.시간 스탬프 가 필요 합 니 다.URL 에 시간 스탬프 를 추가 하면 모든 요청 이 이전 요청 과 다 르 기 때문에 브 라 우 저가 URL 에 대한 캐 시 를 피 할 수 있 습 니 다.
(1)청구 자
    public static String getOpenBodySig(String appId,String entity ) throws Exception{
        String  timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        //MessageDigest        
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        //    update      
        String encodeBody= appId+entity;
        md5.update(encodeBody.getBytes("utf-8"));
        //  digest        
        String appIdEncode = Base64.encodeBase64String(md5.digest());
        //appId     
//        byte[] bytes = DigestUtils.md5(appId);
        // appId entity      
        //                 ,     token ,        
        System.out.println("------------->"+ appIdEncode);
//        String token = JSONObject.toJSONString(appIdEncode);
        // entity    
        String entityBase = Base64.encodeBase64String(entity.getBytes("UTF-8"));
        return "OPEN-BODY-SIG appIdEncode="+"\""+appIdEncode+"\""+", entityBase="+"\""+entityBase+"\""+",timestamp="+"\""+timestamp+"\"";
    }

(2)검증 자
        //    Swagger ,      --earnest
        //    url        ,            ,        
        if (urlMatchUtil.match("/app/orderApi", requestURI)) {
            //        ,       code ,  code ,     appId,          。
            String authorization = request.getHeader("authorization");
            //   ,       authorization,        
            int i = authorization.indexOf("=");
            int a = authorization.indexOf(",");
            //"r1F1Jb/GowKLkqCwd6y0eg=="
            String appIdEncodeInfo = authorization.substring(i + 1, a);
            int appIdEncodeFirst = appIdEncodeInfo.indexOf("\"");
            int appIdEncodeLast = appIdEncodeInfo.lastIndexOf("\"");
            //         appId    
            String appIdCode = appIdEncodeInfo.substring(appIdEncodeFirst + 1, appIdEncodeLast);
            String entityBase = org.apache.commons.lang3.StringUtils.substringAfter(authorization, "entityBase=");
            //      
            String entityBaseInfo = org.apache.commons.lang3.StringUtils.substringBefore(entityBase, ",timestamp=");
            int entityBaseFist = entityBaseInfo.indexOf("\"");
            int entityBaseLast = entityBaseInfo.lastIndexOf("\"");
            //        entity 
            String entityCode = entityBaseInfo.substring(entityBaseFist + 1, entityBaseLast);
            //         
            String timestampInfo = org.apache.commons.lang3.StringUtils.substringAfterLast(authorization, "timestamp=");
            int timestampFirst = timestampInfo.indexOf("\"");
            int timestapLast = timestampInfo.lastIndexOf("\"");
            //           
            String timeStampCode = timestampInfo.substring(timestampFirst + 1, timestapLast);
            DateFormat df1 = new SimpleDateFormat("yyyyMMddHHmmss");
            Date time1 = df1.parse(timeStampCode);
            long time = time1.getTime();
            //                
            if (StringUtils.isEmpty(timeStampCode)) {
                throw BizException.wrap(R.FAIL_CODE,"     ");
            }
            if (System.currentTimeMillis()-time>requestTimestampLimit){
                throw  BizException.wrap(R.FAIL_CODE,"         ");
            }
            //      entityBaseInfo    
            byte[] bytes = Base64.decodeBase64(entityCode);
            String entityTenant = new String(bytes);
            TenantEntity tenantEntity = JSON.parseObject(entityTenant, TenantEntity.class);
            //   code 
            String code = tenantEntity.getCode();
            if (StringUtils.isEmpty(code)){
                throw BizException.wrap(R.FAIL_CODE,"       ");
            }
            //            
            boolean checkTenant = tenantService.check(code);
            if (!checkTenant) {
                throw BizException.wrap(R.FAIL_CODE,"       ");
            }
            //  code  appId
            R appId = dockmentService.getAppIdByCode(code);
            if (StringUtils.isEmpty(appId)){
                throw  BizException.wrap(R.FAIL_CODE,"    appId  ,      ");
            }
            //  code         appId
//            String appId = "10037e6f66f2d0f901672aa27d690006";
            //   appId entity,                   
            String appIdEntity = appId + entityTenant;
            //MessageDigest        
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            //    update      
            md5.update(appIdEntity.getBytes("utf-8"));
            //  digest        
            String appIdEncode = Base64.encodeBase64String(md5.digest());
            //    
            appIdEncode = new String(appIdEncode.getBytes("ISO-8859-1"), "UTF-8");
            appIdCode = new String(appIdCode.getBytes("ISO-8859-1"), "UTF-8");
            if (appIdEncode.trim().equals(appIdCode.trim())) {
                return super.preHandle(request, response, handler);
            } else {
                throw BizException.wrap(R.FAIL_CODE, "     ");
            }
        }

같이 토론 하 다
Mac,Message Digest 를 사용 하여 들 어 오 라 고 요청 한 후에 서비스 측 이 어떻게 검 사 를 하 는 지 아래 에 메 시 지 를 남 길 수 있 습 니 다.

좋은 웹페이지 즐겨찾기