서명 생 성 및 검사

서명 생 성 및 검증 실제 오픈 플랫폼 에서 응용 되 며 호출 절차 와 원 리 를 잠시 알 수 없습니다.
서명 생 성
서명 규칙
  sign                            ,                ,              

서명 생 성 절차:
    1 단계:
          sign                     ,               
    

    2 단계:
        1        ,    "keyvalue"           
    

    세 번 째 단계
        2        HMAC                
    

서명 예 는 다음 과 같 습 니 다.
가설 요청: / anji - open / open - api / request? appId = testApp & method = testApp & sign = 8D45C66B6E1E773614E5866541EAF78D & timestamp = 111 & name = hello & password = 123456 & age = 12
1、    :
    :29bca37bf0174ea287a770cd0d4ff83c
    :appId=testApp&method=testApp&sign=8D45C66B6E1E773614E5866541EAF78D&timestamp=111&name=hello&password=123456&age=12

2、  "sign"          :age、appId、method、name、password、timestamp;
    "keyvalue"       :age12appIdtestAppmethodtestAppnamehellopassword123456timestamp111

3、        HMAC                :8D45C66B6E1E773614E5866541EAF78D

2. 서명 코드 생 성
인자 + 비밀 키 (난수 생 성)
/**
 *     ,       
 * @author lr
 * @date 2019-05-29 17:02
 */
public class SignUtils {

    private final static String SIGN_PARAM="sign";

    /**
     *     
     * @param params
     * @param secret
     * @return
     * @throws IOException
     */
    public static String generateSign(Map params, String secret) throws IOException {
        //    :          
        String[] keys = params.keySet().toArray(new String[0]);
        Arrays.sort(keys);

        //    :              
        StringBuilder query = new StringBuilder();
        for (String key : keys) {
            //    "sign",sign     
            if(StringUtils.equals(SIGN_PARAM,key)) {
                continue;
            }
            String value = params.get(key);
            if (StringUtils.isNotBlank(value)) {
                query.append(key).append(value);
            }
        }

        //    :  HMAC  
        byte[] bytes = encryptHMAC(query.toString(), secret);

        //    :              (       32     ,        )
        return byte2hex(bytes);
    }

    /**
     *   
     * @param data
     * @param secret
     * @return
     * @throws IOException
     */
    public static byte[] encryptHMAC(String data, String secret) throws IOException {
        byte[] bytes = null;
        try {
            SecretKey secretKey = new SecretKeySpec(secret.getBytes(ApiConstants.CHARSET_UTF8), "HmacMD5");
            Mac mac = Mac.getInstance(secretKey.getAlgorithm());
            mac.init(secretKey);
            bytes = mac.doFinal(data.getBytes(ApiConstants.CHARSET_UTF8));
        } catch (GeneralSecurityException gse) {
            throw new IOException(gse.toString());
        }
        return bytes;
    }

    /**
     *  16  
     * @param bytes
     * @return
     */
    public static String byte2hex(byte[] bytes) {
        StringBuilder sign = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() == 1) {
                sign.append("0");
            }
            sign.append(hex.toUpperCase());
        }
        return sign.toString();
    }

    public static void main(String[] args) {
        Map map = new HashMap<>(16);
        map.put("appId","testApp");
        map.put("method","testPost");
        map.put("timestamp","111");
        try {
            String s = generateSign(map, "e113e43bb76a437d94848a2bbbb45b0b");
            System.out.println(s);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3, 검사 서명
게 이 트 웨 이 에서 검 사 를 진행 하 다.
프로 세 스: 요청 매개 변수 에서 매개 변수 + 응용 에서 비밀 키 를 가 져 오고 서명 을 다시 생 성 합 니 다. 서명 에 참여 하 는 것 과 새로 생 성 된 서명 이 일치 하 는 지 비교 하 는 것 은 서명 통과 입 니 다.
질문
1. 프로젝트 에서 매개 변 수 는 서명 을 생 성하 고 인터페이스 에서 받 은 매개 변수 와 서명 을 생 성 하 는 가운데 매개 변 수 는 언제 변 합 니까?인터페이스 호출 프로 세 스 는 어 떻 습 니까?
2. 어떻게 인증 을 합 니까?
/**
 *   appId   
 * @author lr
 * @date 2019-07-26 09:54
 */
public class OpenAppInfoGatewayFilterFactory
        extends AbstractGatewayFilterFactory implements ParentGatewayFilterFactory{

    private Logger logger = LoggerFactory.getLogger(OpenAppInfoGatewayFilterFactory.class);

    public final static int OPEN_APP_INFO_FILTER_ORDER = 2;

    @Autowired
    private CacheHelper cacheHelper;

    public OpenAppInfoGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return new OpenAppInfoGatewayFilter();
    }

    /**
     *       ,  ,AbstractGatewayFilterFactory  ordered   
     *   :       apply()   GatewayFilter,    Ordered  ,    
     *   org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters(java.lang.String, java.util.List):186 
     */
    private class OpenAppInfoGatewayFilter implements GatewayFilter, Ordered {

        @Override
        public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpRequest request = exchange.getRequest();
            MultiValueMap params = request.getQueryParams();
            //1、    appId
            String appId = params.getFirst(SystemParamEnum.APPID.getValue());

            //          
            String appSecret = cacheHelper.getOpenAppSecret(appId);
            if(appSecret == null) {
                return getFilterResult(exchange,getResponseBean(ErrorCode.OPEN_NO_APP,appId));
            }

            //2、  method    
            String method = params.getFirst(SystemParamEnum.METHOD.getValue());
            //          
            ApiDocument apiDocument = cacheHelper.getApiDocument(method);

            if(apiDocument == null) {
                return getFilterResult(exchange,getResponseBean(ErrorCode.OPEN_NO_METHOD,method));
            }
            //           
            String projectCode = apiDocument.getProjectCode();
            if(StringUtils.isBlank(projectCode)) {
                return getFilterResult(exchange,getResponseBean(ErrorCode.METHOD_NO_PROJECT_CODE,method));
            }

            //3、         
            String apiProjectUrl = cacheHelper.getApiProjectUrl(projectCode);
            if(apiProjectUrl == null) {
                return getFilterResult(exchange,getResponseBean(ErrorCode.OPEN_NO_PROJECT,projectCode));
            }
***************************  ************************************************************************
            try {
                String openSecret = SignUtils.generateSign(params.toSingleValueMap(), appSecret);
                //    
                if(!StringUtils.equals(openSecret,params.getFirst(SystemParamEnum.SIGN.getValue()))) {
                    logger.error("      ,{}",params);
                    return getFilterResult(exchange,getResponseBean(ErrorCode.APP_ERROR_SIGN,appId,openSecret));
                }
            } catch (IOException e) {
                return getFilterResult(exchange,getResponseBean(ErrorCode.OPEN_APP_ERROR_SIGN,appId));
            }

            //         、       
            ServerHttpRequest.Builder mutate = request.mutate();

            //4、     
            String requestHeaders = apiDocument.getRequestHeaders();
            List requestHeaderList = new ArrayList<>();
            if(StringUtils.isNotBlank(requestHeaders)) {
                requestHeaderList.addAll(OpenUtils.getListJson(requestHeaders));
                //     
                for(JSONObject header : requestHeaderList) {
                    if(StringUtils.equals("1",header.getString("fixed"))) {
                        mutate.header(header.getString("name"),new String[]{header.getString("value")});
                    }else{
                        //     
                        if(StringUtils.isBlank(request.getHeaders().getFirst(header.getString("name")))) {
                            return getFilterResult(exchange, getResponseBean(ErrorCode.API_NO_HEADER,method,header.getString("name")));
                        }
                    }
                }
            }

            //5、      
            List requestParamsJson = OpenUtils.getListJson(apiDocument.getQueryParams());
            //      
            for(JSONObject param : requestParamsJson) {
                if(param.getBoolean("require")) {
                    if(StringUtils.isBlank(params.getFirst(param.getString("name")))) {
                        return getFilterResult(exchange,
                                getResponseBean(ErrorCode.METHOD_NO_REQUIRE_PARAM,method,param.getString("name")));
                    }
                }
            }

            //   
            ServerHttpRequest newRequest = mutate.build();
            return chain.filter(exchange.mutate().request(newRequest).build());
        }

        @Override
        public int getOrder() {
            return OPEN_APP_INFO_FILTER_ORDER;
        }
    }


    public static class Config{

    }
}

좋은 웹페이지 즐겨찾기