[Java 인증-mac,MessageDigest(1)]
14702 단어 【Java】MD5MAC인증MessageDigest
이틀 동안 계속 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 를 사용 하여 들 어 오 라 고 요청 한 후에 서비스 측 이 어떻게 검 사 를 하 는 지 아래 에 메 시 지 를 남 길 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 주석 분석주 해 는 자바 SE 5.0 버 전이 도입 되 기 시작 한 개념 으로 자바 소스 코드 에 대한 설명 이 며 메타 데이터 (데 이 터 를 설명 하 는 데이터) 입 니 다. 마이크로 서비스, 분포 식 주해 가 유행 하면...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.