서명 생 성 및 검사
9539 단어 오픈 플랫폼서명 생 성 및 검사
서명 생 성
서명 규칙
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×tamp=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{
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
서명 생 성 및 검사서명 생 성 및 검증 실제 오픈 플랫폼 에서 응용 되 며 호출 절차 와 원 리 를 잠시 알 수 없습니다. 서명 생 성 서명 규칙 서명 생 성 절차: 1 단계: 2 단계: 세 번 째 단계 서명 예 는 다음 과 같 습 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.