728x90
반응형

한국방송통신대학교

암복호화 로직

1. 서버에서 RSA 키 생성 모듈 작성
2. 로그인 페이지 접속 시, 공개키/개인키를 생성하여 개인키는 저장하고 공개키는 클라이언트에게 전송
3. 클라이언트에서 자바스크립트 모듈을 사용하여 공개키로 암호화
4. 서버에서 개인키로 복호화




1-2. 키 생성 후, 클라이언트에게 전송

package java.security;

@RequestMapping(“/createKeyPair.do”)
public String createKeyPair(HttpServletRequest request, ModelMap model){

    //지정된 알고리즘에 대한 KeyPairGenerator를 작성
    KeyPairGenerator generator = KeyPairGenerator.getInstance(“RSA”);

    //임의의 열쇠의 사이즈에 대한 열쇠 페어 제네레이터를 초기화
    generator.initialize(2048);
    //열쇠 페어 생성
    KeyPair keyPair = generator. genKeyPair();

    KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);

    //공개키
    PublicKey publicKey = keyPair.getPublic();
    //개인키
    PrivateKey privateKey = keyPair.getPrivate();
    //세션에 개인키 넣기
    request.getSession().setAttribute(“RsaPrivateKey”, privateKey);

    RSAPublicKeySpec publicSpec = keyFactory.getKeySpec(publicKey, RSAPublicKeySpec.class);

    model.put(“modulus”, publicSpec.getModulus().toString(16));
    model.put(“publicExponent”, publicSpec.getPublicExponent().toString(16));

    return “testView”;
}


3. 클라이언트 암호화

  • 암호화 라이브러리(.js) 추가
  • 암호화 함수 생성
function encryptParam(id, pw){
    let encryptInfo ={};

    let publicKey = GenerateKey();

    encryptInfo.encId = EncryptTEA(publicKey, id);
    encryptInfo.encPw = EncryptTEA(publicKey, pw);
    encryptInfo.secKey = EncryptRSA(“${modulus}”, “${publicExponent}”, publicKey);

    encryptInfo.publicKey = publicKey;

    return encryptInfo;
}


4. 서버 복호화

  1. 클라이언트가 서버로 넘긴 암호화 파라미터 추출
  2. 세션에 담은 개인키 추출
  3. 복호화
String id = decode(encId, secKey, RsaPrivateKey);
String pw = decode(encPw, secKey, RsaPrivateKey);
public static String decode(String encMsg, String teaKey, PrivateKey rsaKey){

    String decryptMsg = “”;

    String teaKey = decryptRsa(rsaKey, teaKey);
    TEA tea = new TEA(teaKey);

    decryptMsg = tea.decrypt(encMsg);

    return decryptMsg;
    }

    private static String decryptRsa(PrivateKey privateKey, String securedValue){

    Cipher cipher = Cipher.getInstance(“RSA”);

    byte[] encryptedBytes = hexToByteArray(securedValue);
    cipher.init(Cipher.DECRYPT_MODE, privateKey);

    byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
    String decryptedValue = new String(decryptedBytes, “utf-8”);

    return decryptedValue;
}




728x90
반응형
728x90
반응형


Transaction

- 사전 준비물: 넥사크로 X-API(서버에 추가)
- 서버에 저장된 데이터를 가져오거나 갱신하는 함수로써 완료 시 콜백 함수 수행



this.transaction(svcId, svcUrl, inDataset, outDataset, inVar, callbackFunc[, bAsync, nDataType, bCompress]);


필수 파라미터

  • svcId: 트랜잭션ID
  • svcUrl: 트랜잭션을 요청할 서버페이지 주소
  • inDataset: 서버로 보낼 dataset의 id
  • outDataset: 서버에서 보낸 데이터를 받을 dataset의 id
  • inVar: 서버페이지에 보낼 정보를 문자열로 설정(Ex. “name=waterparsley”)
  • callbackFunc: 트랜잭션 결과를 받을 때 호출 될 콜백 함수명



* TypeDefinition의 Service를 통한 svrUrl 설정

  • TypeDefinition: 넥사크로플랫폼을 포함하여 넥사크로스튜디오에서 실행할 Prefix 정보들을 포함
  • Service Definition: 넥사크로 스튜디오에서 사용되는 Folder Path나 Internet URL 등을 관리
//testUrl은 접근하려는 컨트롤러 경로를 설정한 것으로 가정
//기본 형식
//prefixID::요청URL / prefixID::파일명.확장자
svcUrl = “testUrl::list.do”; 

this.transaction(“testId”, svcUrl, inDataset, outDataset, inVar, callbackFunc);



*특정 파라미터(inDataset, outDataset, inVar)의 경우, 여러 개 선언이 가능하며 공백(space)으로 구분



➰그외 파라미터(생략 가능)

  • bAsync: false(동기), true(비동기-기본값)
  • nDataType: 트랜잭션 시 전송되는 데이터 형식
  • 0(XML-기본값), 1(Binary), 2(SSV), 3(JSON)
  • bCompress: 트랜잭션 시 데이터를 압축시킬지 설정
  • false(미압축-기본값), true(압축)




728x90
반응형
728x90
반응형

 

Spring 공식 홈페이지( https://start.spring.io/ )를 통해 프로젝트(Gradle - Groovy  / Spring boot  3.2.4  / Package: Jar  / Java 17)를 생성한 후,

IntelliJ에서 해당 프로젝트를 빌드했는데 오류 발생

 

 

 

※ 오류 내용

A problem occurred configuring root project 'hello-spring'.`
> Could not resolve all files for configuration ':classpath'.
> Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.1.
Required by:
project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.1
> No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.1 was found. The consumer was configured to find a runtime of a library compatible with Java 11, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.6' but:
- Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 11

 

 

한마디로 프로젝트에서 지원하는 자바 버전과 현재 IntelliJ에 설정된 자바 버전이 맞지 않다는 소리

아래 두가지 설정을 변경하면 해결될 거임

참고로 스프링부트3.x 는 자바17부터 지원하기 때문에 스프링부트 2.x는 자바11을 이용해야 함

 

 

1. 프로젝트 sdk 버전 설정

Project Settings(Ctrl+Alt+Shift+S) > Project - SDK => jdk 17

 

2. Gradle JVM 버전 설정

File > Settings > Build, Execute, Deployment > Build Tools > Gradle - Gradle JVM => jdk 17

728x90
반응형
728x90
반응형


WebBrowser

웹브라우저 ActiveX/Plugin의 Wrapper 컴포넌트(iframe과 비슷한 기능인 듯)



✅ 주요 속성 / 메서드

- set: WebBrowser에 표시될 웹페이지의 URL을 설정하는 속성
- onloadcompleted(): WebBrowser에 요청한 웹페이지가 로딩 되었을 때 발생하는 이벤트
- onusernotify(): WebBrowser에 로드된 웹페이지에서 nexacro 쪽으로 정보를 전달할 때 발생하는 이벤트


내 상황😕


파일 다운로드할 때 필요한 데이터를 RSA로 암호화


1. 클라이언트단에서 RSA를 비동기 호출
2. 서버에서 공개키/비공개키 생성 후, 비공개키는 세션 정보에 담고, 공개키는 리턴
3. 리턴받은 공개키를 가지고 jsp에서 암호화 작업
(파일 다운로드를 요청할 때마다 공개키가 동적으로 생성되기 때문에 공개키를 jsp로 리턴)
4. 리턴 받은 공개키를 가지고 데이터 암호화 처리 후, 이를 넥사크로 쪽에 object로 반환
5. 넥사크로 쪽에서 암호화된 정보를 가진 object를 서버에 전송

이 과정에서 나는 넥사크로 WebBrowser 컴포넌트를 이용하여 jsp를 로드한 후, jsp 내 선언된 암호화 메소드를 호출하려고 했음.

그래서 form onload 메서드에서 WebBrowser 컴포넌트의 url을 설정해주고, 파일 다운로드 메서드 내에서 WebBrowser.callMethod(“aaa”);를 호출했는데 로컬에선 문제없이 돌아감.

근데 개발 서버에 올리니까 간헐적으로 에러가 나는거임.

에러
Uncaught TypeError: Cannot read properties of null (reading 'aaa')


해결책🧐


알고보니 WebBrowser 내 callMethod는 WebBrowser 내 페이지의 로딩 유무와 관계없이 비동기 호출되는 거였음!
그래서 onloadcompleted를 사용해서 WebBrowser에 페이지가 로딩된 후에 callMethod를 호출하도록 수정함.




728x90
반응형
728x90
반응형


선작업

투비소프트 공식 사이트에서 체험판 라이선스를 신규 발급 받는다.




✅ 넥사크로 스튜디오 라이선스 갱신


메일로 받은 라이선스 키를 넥사크로 스튜디오에 입력한다.
🚨이때 주의할 점
Application/Service명은 TOBESOFT라고 입력한다! (메일에 적힌 그대로)




✅ 서버 라이센스 갱신


서버 라이선스를 갱신하지 않아도 작업은 가능하지만 콘솔에 유효기간 관련 로그가 대량으로 찍히기 때문에 갱신하는게 좋다.

- 위치: 프로젝트명/src/main/resources/nexacro17_server_license.xml

해당 파일에 신규 발급 받은 라이선스 키와 날짜만 변경해주면 된다.



728x90
반응형
728x90
반응형



설정 화면 경로: Window > Preferences > General > Editors > File Associations

1. File types 영역에서 *.jsp를 선택

2. Associated editors 영역에서 JSP Editor
(locked by ‘JSP’ content type)... 선택 후 Default 버튼 클릭하면 해당 값이 상단으로 올라가면서 기본값이 변경됨


변경 후 바로 적용되는 것이 아니니
열려있던 jsp창을 다 끄고 다시 켜보면 상단 미리보기 화면이 사라져있음!




728x90
반응형
728x90
반응형


설정 화면 경로: Tools > Options > Environment > Show Information

Show Title 하위

✅at Project Explorer
✅at Child Tab

at Project Explorer, at Child Tab 모두 체크하면 됨



728x90
반응형
728x90
반응형


1. 인터넷망 PC에서 jar 파일 준비

  • 해당 PC에 본인이 필요한 이클립스 플러그인 설치
  • plugins 폴더(\eclipse\plugins)에 본인이 설치한 플러그인 jar 파일 옮기기(CD든 뭐든)

2. 폐쇄망 PC에 jar 파일 추가

  • plugins 폴더(\eclipse\plugins)에 가져온 jar 파일 추가
  • *bundles.info 파일 수정(\eclipse\configuration\org.eclipse.equinox.simpleconfigurator)

* bundles.info 파일 수정

해당 파일 내에 아래 형식으로 텍스트 추가

식별자,버전,파일경로(plugins/jar 파일명),4,false
  • 식별자: jar 파일명을 언더바(_) 기준으로 구분하여 언더바 앞부분
  • 버전: jar 파일명을 언더바(_) 기준으로 구분하여 언더바 뒷부분
  • 파일경로: plugins/ + jar 파일명


예)

  • jar 파일명: com.github.eclipsecolortheme_1.0.0.201410260308.jar
  • 추가할 텍스트: com.github.eclipsecolortheme,1.0.0.201410260308,plugins/com.github.eclipsecolortheme_1.0.0.201410260308.jar,4,false




728x90
반응형
728x90
반응형

*고정 필터 설정


1. Schema Browser 클릭
2. 화면의 왼쪽에 object 별로 검색할 수 있는 영역이 있는데 그중에 필터 모양의 버튼을 클릭
3. 필터를 설정할 수 있는 팝업창이 열리면 Schema, Table, Column 명 별로 필터를 설정할 수 있음


-필터를 여러 개 걸고 싶으면 세미콜론(;) 찍고 추가하면 됨



*검색 시 필터 적용


단순 일회성으로 필터 적용을 원한다면 필터 아이콘 옆에 있는 텍스트 박스에 입력하면 됨.

✔️ 필터 문법(?)

  • parsley로 시작하는: parsley%
  • parsley로 끝나는: %parsley
  • parsley를 포함하는: %parsley%


like 함수 사용할 때랑 똑같음
여기도 마찬가지로 필터 여러 개 적용할거면 세미콜론(;)으로 구분



참조
https://forums.toadworld.com/t/filter-schema-browser-multiple-criteria/55919

728x90
반응형
728x90
반응형
SELECT SYSDATE
      ,TO_CHAR(SYSDATE, ‘Q’) - 1 AS “전분기”
      ,ADD_MONTHS(TRUNC(SYSDATE), ‘Q’,- 3) AS “전분기첫일”
      ,TRUNC(SYSDATE, ‘Q’) - 1 AS “전분기막일”
      ,TO_CHAR(SYSDATE, ‘Q’) AS “현분기“
      ,TRUNC(SYSDATE, ‘Q’) AS “현분기첫일”
      ,ADD_MONTHS(SYSDATE, ‘Q’, 3) - 1 AS “현분기막일”
FROM dual
;


728x90
반응형

+ Recent posts