Search
Duplicate
📢

[공통] 연동 전 확인사항

원하는 목차 항목을 누르면 해당 내용으로 이동합니다.

0.1 요청 도메인

구분
URL
운영
개발

0.2. 공통 전문 형식

JSON 형식으로 서비스하며, 바이트(byte)로 길이가 나타납니다. (숫자 유형의 경우 길이는 없습니다.)
sucsFair, procCd, rsltMesg 항목은 모든 API에서 공통적으로 사용되며, rsltObj는 API별로 다릅니다.
Request
no
필드명
유형
필수
설명
1
data
JSON
Y
요청 데이터
Request - Login 예시
{ "uscoSno": "", "mbtlNo": "01089006205", "pwd": "12345678910" }
JSON
복사
Response
no
필드명
유형
필수
설명
1
sucsFalr
String
Y
성공 실패 여부
2
rsltCd
String
Y
응답 코드 ‘HCO000’이 아닌 경우는 모두 오류입니다.
3
rsltMesg
String
Y
응답 메시지
4
rsltObj
JSON
N
API별 응답 데이터
Response - Login 예시
{ "sucsFalr": "success", "rsltCd": "HCO000", "rsltMesg": "정상 처리 되었습니다.", "rsltObj": { "uscoSno": 1, "mbtlNo": "01012345678", "acsTkn": "access token 값", "rfshTkn": "refresh token 값" } }
JSON
복사

0.3. 암호화

구분
내용
단방향 암호화
비밀번호에만 사용되며, 고객사가 원하는 방식으로 암호화를 한 후 API를 호출합니다. 하이픈은 Spring의 PasswordEncoder 인터페이스를 이용해 한 번 더 인코딩한 후 저장합니다.
양방향 암호화
고객사로부터 받은 개인정보는 하이픈에서 발급 받은 키를 사용하여 통신 시 암호화됩니다. 개인정보에 해당하는 부분은 통신 시 암호화가 필수이며, 하이픈에서 응답 시에는 마스킹 정보와 암호화 정보를 모두 제공합니다.

0.3.1. 암복호화 샘플소스

SecurityLib.java
7.3KB
package im.hyphen.common.util; import org.apache.tomcat.util.codec.binary.Base64; import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; public class SecurityLib { /* * 사용 설명 * - AES256HEXKEY 를 Hex.decode 하여 나온값을 aesCBCEncryptBase64 메소드의 aesKey 파라미터값으로 사용하고 * - AES256HEXKEY의 앞 16byte를 iv 파라미터 값으로 사용한다. * 호출 예시 * - aesCBCEncryptBase64(Hex.decodeHex(AES256HEXKEY.toCharArray()), AES256HEXKEY.substring(0,16), "1234", StandardCharsets.UTF_8); */ private static String AES256HEXKEY = "492BE16564A3C02D4098591ED3107AA65CBD0240B6A7A08B4F76294D7BA54223"; /* * 사용 설명 * - 제공받은 Base64로 인코딩 된 string 형태의 publicKey를 getPublicKeyFromBase64Encrypted 메소드를 호출하여 public 키를 획득 한다. * 호출 예시 * - encryptRSA("1234", getPublicKeyFromBase64Encrypted(publicKey)); */ private static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCNIcKGLEviht64pqIlvGGjv3w/Hj+5Up6e6iUi5lAkTMbL0anLdUmn7iCjILyz/DV52jutXxeVUYAdbD8lwgNLGV7ikhb4TJV5oexq6coyk/i/hMrHQXnEjf2L6uGdq5xr0Rj2vpgS4JrrnVBC4B2bdEkdc4OLHZ7UQX5U4ON3lwIDAQAB"; /** * AES128, AES256 CBC운영모드 암호화 처리 후 Base64 인코딩 문자열로 리턴 * @param aesKey HEX 디코딩 결과값 * @param iv HEX 인코딩 된 결과 값의 앞 16byte * @param plainText 평문 * @param charSet * @return AES128, AES256 Base64암호화문자열 */ public static String aesCBCEncryptBase64(byte[] aesKey, String iv, String plainText, String charSet) { String returnValue = null; try { /* Userkey check */ if( aesKey == null ) { throw new Exception("(pbUserKey) is not allowed null value !!"); } else { if( aesKey.length != 16 && aesKey.length != 32 ) { throw new Exception("(pbUserKey) is wrong !!"); } } /* iv check */ if( iv == null ) { throw new Exception("(iv) is not allowed null value !!"); } else { if( iv.length() != 16 ) { throw new Exception("(iv) is wrong !!"); } } /* aes128 CBC Encryption */ byte[] plainTextByte; if( charSet == null ) { plainTextByte = plainText.getBytes(); } else { plainTextByte = plainText.getBytes(charSet); } SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); c.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); byte[] encryptDataByte = c.doFinal(plainTextByte); returnValue = new String(Base64.encodeBase64(encryptDataByte)); } catch (Exception e) { return null; } return returnValue; } /** * AES128, AES256 CBC운영모드 암호화 처리 후 Base64로 인코딩 처리한 문자열을 Base64 디코딩 후 복호화 처리 * @param aesKey * @param iv * @param encryptBase64Text * @param charSet * @return 복호화문자열 */ public static String aesCBCDecryptBase64(byte[] aesKey, String iv, String encryptBase64Text, String charSet ) { String returnValue = null; try { /* Userkey check */ if( aesKey == null ) { throw new Exception("(pbUserKey) is not allowed null value !!"); } else { if( aesKey.length != 16 && aesKey.length != 32 ) { throw new Exception("(pbUserKey) is wrong !!"); } } /* iv check */ if( iv == null ) { throw new Exception("(iv) is not allowed null value !!"); } else { if( iv.length() != 16 ) { throw new Exception("(iv) is wrong !!"); } } /* seed CBC Decryption */ SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); c.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] encryptDataByte = Base64.decodeBase64(encryptBase64Text); byte[] decryptDataByte = c.doFinal(encryptDataByte); if( charSet == null ) { returnValue = new String(decryptDataByte); } else { returnValue = new String(decryptDataByte, charSet); } } catch (Exception e) { return null; } return returnValue; } public static PublicKey getPublicKeyFromBase64Encrypted(String base64PublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException { byte[] decodedBase64PubKey = Base64.decodeBase64(base64PublicKey); return KeyFactory.getInstance("RSA") .generatePublic(new X509EncodedKeySpec(decodedBase64PubKey)); } /** * Public Key로 RSA 암호화를 수행합니다. * @param plainText 암호화할 평문입니다. * @param publicKey 공개키 입니다. * @return */ public static String encryptRSA(String plainText, PublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] bytePlain = cipher.doFinal(plainText.getBytes()); String encrypted = java.util.Base64.getEncoder().encodeToString(bytePlain); return encrypted; } /** * Private Key로 RSA 복호화를 수행합니다. * * @param encrypted 암호화된 이진데이터를 base64 인코딩한 문자열 입니다. * @param privateKey 복호화를 위한 개인키 입니다. * @return * @throws Exception */ public static String decryptRSA(String encrypted, PrivateKey privateKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException { Cipher cipher = Cipher.getInstance("RSA"); byte[] byteEncrypted = java.util.Base64.getDecoder().decode(encrypted.getBytes()); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] bytePlain = cipher.doFinal(byteEncrypted); return new String(bytePlain, StandardCharsets.UTF_8); } }
JavaScript
복사
이용사 AES 암호화 테스트 API
이용사 AES 복호화 테스트 API