jwt 파일을 이미 생성했다면 다음은 생성 한 jwt를 파일 형태로 쓰고
원본 데이터 역시 파일로 쓰기를 해야 합니다.
이 경우 생각해야 할 것이 원본 데이터의 무결성 문제
그리고 jwt로 원본 데이터 추적이 가능한지 입니다.
우선 원본 데이터 무결성 해결을 위해 다음과 같이 해보도록 하겠습니다.
위의 구조가 되기 위해서 사용해야 하는 라이브러리는 대략
기본적인 FileWriter, FileOutputStream과 이전에 만들었던 jwtUtile
그리고 Hash값을 생성하는 라이브러리가 필요합니다.
우선 입력받은 데이터를 JSON String 형태로 변환하는 것은 jwtUtile의
parserMapFromJson 함수를 사용하면 가능합니다.
public static String parserMapFromJson(Map<String, Object> map) throws Exception{
String jsonData = new String();
ObjectMapper mapper = new ObjectMapper();
jsonData = mapper.writeValueAsString(map);
return jsonData;
}
입력값을 Map으로 형태로 저장하면 JSON String의 형태로 리턴 받을 수 있습니다.
리턴 받은 값을 javaSecurity를 이용해 SHA-256으로 생성합니다.
생성 방법은 다음과 같습니다.
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(base.getBytes("UTF-8"));
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
이렇게 생성이 된 해시 값을 어떻게 저장할 것인가는 고민스러운 부분입니다.
왜냐하면 해시값 체크를 위해서는 원본 데이터와 해시값을 맵핑해야 하기 때문입니다.
이 경우는 DBMS를 사용하면 쉽겠지만 다른 방법을 찾아보기로 했습니다.
우선 JSON String을 생성할 때 유일 키를 시스템이 자동 생성할 예정입니다.
유일키 생성을 순차적으로 해야 하는 경우 마지막 생성 키값을 저장해야 합니다.
그래서 저는 "랜덤 3자리 + yyyyMMddhhmmss + 랜덤 3자리"으로 키를 생성하고
JSON String에 포함하겠습니다.
public static String parserMapFromJson(Map<String, Object> map) throws Exception{
String jsonData = new String();
ObjectMapper mapper = new ObjectMapper();
String keyString = randomString(3) + getToDate() + randomString(3);
map.put("jsonkey", keyString);
jsonData = mapper.writeValueAsString(map);
return jsonData;
}
위에서는 이미 만들었던 randomString(), getToDate() 함숫값으로 키를 만들어서 입력값을 JSON String으로 선언하기 전에 Map에 추가했습니다.
일단, 위와 같이 데이터를 설정하고 이전에 만들었던 jwt와 함께 파일로 생성하겠습니다.
파일 생성은 java에서 재공해 주는 기본 라이브러리를 이용하도록 하겠습니다.
이 부분부터는 다은에 이어서 하도록 하겠습니다.