728x90
반응형
728x90
반응형

톰캣 서비스를 올릴 때 Resource is out of sync with the file system ~ 관련해서 에러가 나는 경우가 있습니다.


해당 오류는 svn 또는 cvs 싱크가 맞지 않아서 간혹 발생하는 오류라고 하네요.


진행중인 프로젝트를 새로고침하시면 해결이 된다고 합니다.


또는 

Project -> Clean... 를 하면 됩니다.




728x90
반응형
728x90
반응형


프로젝트 개발을 하다보면 디버깅 모드는 필수인데요.


디버깅 중 java파일이 아닌 class파일이 보여지는 경우가 있습니다.

해당 현상에 대해 해결하는 방법에 대해 알아보겠습니다.


디버깅을 찍어보면 java파일이 아니라 class파일로 디버깅이 찍히고 있네요.


해결방법은 간단합니다.

동작중인 톰캣을 우클릭합니다.

Edit Source Lookup...을 클릭합니다.


Default를 제거합니다.


현재 진행중인 프로젝트를 추가합니다.



다시 디버깅을 찍으면 java파일이 실행되는 것을 확인할 수 있습니다.

설정을 하고 class파일이 찍힌다면 서비스를 다시 재시작해보시고 디버깅을 찍으면 됩니다.


728x90
반응형
728x90
반응형

패스워드를 SHA256으로 암호화하는 방법에 대해 알아보겠습니다.


1) 패스워드를 암호화하는 KsShaEncrypt.java 파일을 프로젝트에 적절한 위치에 추가해줍니다.

public class KsShaEncrypt {
	
	private static int ENDIAN = Common.BIG_ENDIAN;

	private static final int SHA256_DIGEST_BLOCKLEN = 64;
	private static final int SHA256_DIGEST_VALUELEN = 32;

	private static final int SHA256_K[] =
	{
		0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
		0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
		0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
		0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
		0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
		0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
		0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
		0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
		0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
		0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
		0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
	};

	private static final int ROTL_ULONG(int x, int n) {
		return (x << n) | Common.URShift(x, 32 - n);
	}

	private static final int ROTR_ULONG(int x, int n) {
		return Common.URShift(x, n) | (x << (32 - (n)));
	}

	private static final int ENDIAN_REVERSE_ULONG(int dwS) {
		return ( (ROTL_ULONG((dwS),  8) & 0x00ff00ff) | (ROTL_ULONG((dwS), 24) & 0xff00ff00) );
	}

	private static final void BIG_D2B(int D, byte[] B, int B_offset) {
		Common.int_to_byte_unit(B, B_offset, D, ENDIAN);
	}

	private static final int RR(int x, int n) { return ROTR_ULONG(x, n); }
	private static final int SS(int x, int n) { return Common.URShift(x, n); }

	private static final int Ch(int x, int y, int z) { return ((x & y) ^ ((~x) & z)); }
	private static final int Maj(int x, int y, int z) { return ((x & y) ^ (x & z) ^ (y & z)); }
	private static final int Sigma0(int x) { return (RR(x,  2) ^ RR(x, 13) ^ RR(x, 22)); }
	private static final int Sigma1(int x) { return (RR(x,  6) ^ RR(x, 11) ^ RR(x, 25)); }

	private static final int RHO0(int x) { return (RR(x,  7) ^ RR(x, 18) ^ SS(x,  3)); }
	private static final int RHO1(int x) { return (RR(x, 17) ^ RR(x, 19) ^ SS(x, 10)); }

	private static final int abcdefgh_a = 0;
	private static final int abcdefgh_b = 1;
	private static final int abcdefgh_c = 2;
	private static final int abcdefgh_d = 3;
	private static final int abcdefgh_e = 4;
	private static final int abcdefgh_f = 5;
	private static final int abcdefgh_g = 6;
	private static final int abcdefgh_h = 7;

	private static final void FF(int[] abcdefgh, int a, int b, int c, int d, int e, int f, int g, int h, int[] X, int j) {
		long T1;

		T1 = Common.intToUnsigned(abcdefgh[h]) + Common.intToUnsigned(Sigma1(abcdefgh[e])) + Common.intToUnsigned(Ch(abcdefgh[e], abcdefgh[f], abcdefgh[g])) + Common.intToUnsigned(SHA256_K[j]) + Common.intToUnsigned(X[j]);
		abcdefgh[d] += T1;
		abcdefgh[h] = (int)(T1 + Common.intToUnsigned(Sigma0(abcdefgh[a])) + Common.intToUnsigned(Maj(abcdefgh[a], abcdefgh[b], abcdefgh[c])));
	}

	private static final int GetData(byte[] x, int x_offset) {
		return Common.byte_to_int(x, x_offset, ENDIAN);
	}
	
	//*********************************************************************************************************************************
	// o SHA256_Transform() : 512 비트 단위 블록의 메시지를 입력 받아 연쇄변수를 갱신하는 압축 함수로써
	//	                      4 라운드(64 단계)로 구성되며 8개의 연쇄변수(a, b, c, d, e, f, g, h)를 사용
	// o 입력                               : Message               - 입력 메시지의 포인터 변수
	//	                      ChainVar              - 연쇄변수의 포인터 변수
	// o 출력                               :
	//*********************************************************************************************************************************
	private static void SHA256_Transform(byte[] Message, int[] ChainVar) {
		int abcdefgh[] = new int[8];
		int T1[] = new int[1];
		int X[] = new int[64];
		int j;

		for (j = 0; j < 16; j++)
			X[j] = GetData(Message, j*4);

		for (j = 16; j < 64; j++)
			X[j] = (int)(Common.intToUnsigned(RHO1(X[j - 2])) + Common.intToUnsigned(X[j - 7]) + Common.intToUnsigned(RHO0(X[j - 15])) + Common.intToUnsigned(X[j - 16]));

		abcdefgh[abcdefgh_a] = ChainVar[0];
		abcdefgh[abcdefgh_b] = ChainVar[1];
		abcdefgh[abcdefgh_c] = ChainVar[2];
		abcdefgh[abcdefgh_d] = ChainVar[3];
		abcdefgh[abcdefgh_e] = ChainVar[4];
		abcdefgh[abcdefgh_f] = ChainVar[5];
		abcdefgh[abcdefgh_g] = ChainVar[6];
		abcdefgh[abcdefgh_h] = ChainVar[7];

		for (j = 0; j < 64; j += 8)
		{
			FF(abcdefgh, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, X, j + 0);
			FF(abcdefgh, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, X, j + 1);
			FF(abcdefgh, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, X, j + 2);
			FF(abcdefgh, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, X, j + 3);
			FF(abcdefgh, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, X, j + 4);
			FF(abcdefgh, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, X, j + 5);
			FF(abcdefgh, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, X, j + 6);
			FF(abcdefgh, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, X, j + 7);
		}

		ChainVar[0] += abcdefgh[abcdefgh_a];
		ChainVar[1] += abcdefgh[abcdefgh_b];
		ChainVar[2] += abcdefgh[abcdefgh_c];
		ChainVar[3] += abcdefgh[abcdefgh_d];
		ChainVar[4] += abcdefgh[abcdefgh_e];
		ChainVar[5] += abcdefgh[abcdefgh_f];
		ChainVar[6] += abcdefgh[abcdefgh_g];
		ChainVar[7] += abcdefgh[abcdefgh_h];
	}

	/**
	@brief 연쇄변수와 길이변수를 초기화하는 함수
	@param Info : SHA256_Process 호출 시 사용되는 구조체
	*/
	public static void SHA256_Init( SHA256_INFO Info ) {
		Info.uChainVar[0] = 0x6a09e667;
		Info.uChainVar[1] = 0xbb67ae85;
		Info.uChainVar[2] = 0x3c6ef372;
		Info.uChainVar[3] = 0xa54ff53a;
		Info.uChainVar[4] = 0x510e527f;
		Info.uChainVar[5] = 0x9b05688c;
		Info.uChainVar[6] = 0x1f83d9ab;
		Info.uChainVar[7] = 0x5be0cd19;

		Info.uHighLength = Info.uLowLength = 0;
	}

	/**
	@brief 연쇄변수와 길이변수를 초기화하는 함수
	@param Info : SHA256_Init 호출하여 초기화된 구조체(내부적으로 사용된다.)
	@param pszMessage : 사용자 입력 평문
	@param inLen : 사용자 입력 평문 길이
	*/
	public static void SHA256_Process( SHA256_INFO Info, byte[] pszMessage, int uDataLen ) {
		int pszMessage_offset;

		if((Info.uLowLength += (uDataLen << 3)) < 0) {
			Info.uHighLength++;
		}

		Info.uHighLength += Common.URShift(uDataLen,29);

		pszMessage_offset = 0;
		while (uDataLen >= SHA256_DIGEST_BLOCKLEN) {
			Common.arraycopy_offset(Info.szBuffer, 0, pszMessage, pszMessage_offset, SHA256_DIGEST_BLOCKLEN);
			SHA256_Transform(Info.szBuffer, Info.uChainVar);
			pszMessage_offset += SHA256_DIGEST_BLOCKLEN;
			uDataLen -= SHA256_DIGEST_BLOCKLEN;
		}

		Common.arraycopy_offset(Info.szBuffer, 0, pszMessage, pszMessage_offset, uDataLen);
	}

	/**
	@brief 메시지 덧붙이기와 길이 덧붙이기를 수행한 후 마지막 메시지 블록을 가지고 압축함수를 호출하는 함수
	@param Info : SHA256_Init 호출하여 초기화된 구조체(내부적으로 사용된다.)
	@param pszDigest : 암호문
	*/
	public static void SHA256_Close( SHA256_INFO Info, byte[] pszDigest ) {
		int i, Index;

		Index = Common.URShift(Info.uLowLength, 3) % SHA256_DIGEST_BLOCKLEN;
		Info.szBuffer[Index++] = (byte)0x80;

		if (Index > SHA256_DIGEST_BLOCKLEN - 8) {
			Common.arrayinit_offset(Info.szBuffer, Index, (byte)0, SHA256_DIGEST_BLOCKLEN - Index);
			SHA256_Transform(Info.szBuffer, Info.uChainVar);
			Common.arrayinit(Info.szBuffer, (byte)0, SHA256_DIGEST_BLOCKLEN - 8);
		}
		else {
			Common.arrayinit_offset(Info.szBuffer, Index, (byte)0, SHA256_DIGEST_BLOCKLEN - Index - 8);
		}

		if(ENDIAN == Common.LITTLE_ENDIAN) {
			Info.uLowLength = ENDIAN_REVERSE_ULONG(Info.uLowLength);
			Info.uHighLength = ENDIAN_REVERSE_ULONG(Info.uHighLength);
		}

		Common.int_to_byte_unit(Info.szBuffer, ((int)(SHA256_DIGEST_BLOCKLEN / 4 - 2))*4, Info.uHighLength, ENDIAN);
		Common.int_to_byte_unit(Info.szBuffer, ((int)(SHA256_DIGEST_BLOCKLEN / 4 - 1))*4, Info.uLowLength, ENDIAN);

		SHA256_Transform(Info.szBuffer, Info.uChainVar);

		for (i = 0; i < SHA256_DIGEST_VALUELEN; i += 4)
			BIG_D2B((Info.uChainVar)[i / 4], pszDigest, i);
	}

	/**
	@brief 사용자 입력 평문을 한번에 처리
	@param pszMessage : 사용자 입력 평문
	@remarks 내부적으로 SHA256_Init, SHA256_Process, SHA256_Close를 호출한다.
	*/
	public static synchronized String encrypt( String pMessage) throws Exception{
		SHA256_INFO info = new SHA256_INFO();
		byte[] pszMessage = pMessage.getBytes("utf-8");
		byte pszDigest[]   = new byte[32];
		SHA256_Init( info );
		SHA256_Process( info, pszMessage, pszMessage.length );
		SHA256_Close( info, pszDigest );
		return getString(pszDigest);
	}


	public static class SHA256_INFO {
		public int uChainVar[] = new int[SHA256_DIGEST_VALUELEN / 4];
		public int uHighLength;
		public int uLowLength;
		public byte szBuffer[] = new byte[SHA256_DIGEST_BLOCKLEN];
	}
	
	public static class Common {
		
		public static final int BIG_ENDIAN = 0;
		public static final int LITTLE_ENDIAN = 1;

		public static void arraycopy(byte[] dst, byte[] src, int length) {
			for(int i=0; i<length; i++)="" {="" dst[i]="src[i];" }="" public="" static="" void="" arraycopy_offset(byte[]="" dst,="" int="" dst_offset,="" byte[]="" src,="" src_offset,="" length)="" for(int="" i="0;" i> shift_value;
				return (byte)value;
			} else {
				int shift_value = (b_offset%4)*8;
				int mask_value =  0x0ff << shift_value;
				int value = (src[b_offset/4] & mask_value) >> shift_value;
				return (byte)value;
			}
			
		}
		
		public static byte[] get_bytes_for_ints(int[] src, int offset, int ENDIAN) {
			int iLen = src.length-offset;
			byte[] result = new byte[(iLen)*4];
			for(int i=0; i> 24) & 0x0ff);
				dst[dst_offset+1] = (byte)((src >> 16) & 0x0ff);
				dst[dst_offset+2] = (byte)((src >> 8) & 0x0ff);
				dst[dst_offset+3] = (byte)((src) & 0x0ff);
			} else {
				dst[dst_offset] = (byte)((src) & 0x0ff);
				dst[dst_offset+1] = (byte)((src >> 8) & 0x0ff);
				dst[dst_offset+2] = (byte)((src >> 16) & 0x0ff);
				dst[dst_offset+3] = (byte)((src >> 24) & 0x0ff);
			}
			
		}

		public static void int_to_byte_unit_big_endian(byte[] dst, int dst_offset, int src){
			dst[dst_offset] = (byte)((src>> 24) & 0x0ff);
			dst[dst_offset+1] = (byte)((src >> 16) & 0x0ff);
			dst[dst_offset+2] = (byte)((src >> 8) & 0x0ff);
			dst[dst_offset+3] = (byte)((src) & 0x0ff);
		}

		public static int URShift(int x, int n){
			if(n == 0)
				return x;
			if(n >= 32)
				return 0;
			int v = x >> n;
			int v_mask = ~(0x80000000 >> (n-1));
			return v & v_mask;
		}
		
		public static final long INT_RANGE_MAX = (long)Math.pow(2, 32);

		public static long intToUnsigned(int x){
			if(x >= 0)
				return x;
			return x + INT_RANGE_MAX;
		}
	}
	public static String getString(byte[] data){
		String result = "";
		for(int i=0; i<data.length; i++)="" {="" result="result" +="" tohex(data[i]);="" }="" return="" result;="" public="" static="" string="" tohex(int="" b){="" char="" c[]="new" char[2];="" c[0]="toHexNibble((b">>4) & 0x0f);
		c[1] = toHexNibble(b & 0x0f);
		return new String(c);
	}

	public static char toHexNibble(int b){
		if(b >= 0 && b <= 9)
			return (char)(b + '0');
		if(b >= 0x0a && b <= 0x0f)
			return (char)(b + 'A' - 10);
		return '0';
	}

}



2) 패스워드를 넘겨받는 부분에서 password를 암호화 시켜줍니다.

이때 

KsShaPassword = KsShaPassword.toUpperCase();  //모두 대문자로 바꾸기

KsShaPassword = KsShaPassword.toLowerCase();  //모두 소문자로 바꾸기

상황에 맞게 이용해 주시면 되겠습니다.

//평문이 아닌 KsSha암호화방식 암호를 전달
String KsShaPassword = "";
try {
	KsShaPassword = KsShaEncrypt.encrypt(password);
	KsShaPassword = KsShaPassword.toLowerCase();
} catch (Exception e) {
	log.error("login is failed by KsShaEncrypt - " + e.toString());
	e.printStackTrace();
}

 알면 쉽고 모르면 어려운 SHA256 암호화하는 방법에 대해 설명해드렸습니다.


* 추가로 SHA256암호화 시켜주는 해시생성기 링크 남깁니다.


http://www.convertstring.com/ko/Hash/SHA256



a 를 암호화한 값 : 112CA1BBDCAFAC231B39A23DC4DA786EFF8147C4E72B9807785AFEE48BB 

이 값을 대,소문자로 DB에 저장해주고 싶다면 toUpperCase(); 함수를 사용하시면 됩니다.


KsShaEncrypt.java


728x90
반응형
728x90
반응형

개발 중 아래와 같은 오류가 나서 해결방안 공유하고자 포스팅합니다.

해당 사이트가 신뢰할 수 없는 사이트기에 나는 오류로 판단?됩니다...



 1) 제어판 -> Java 아이콘을 클릭합니다.


2) 보안을 클릭 후 사이트 목록 편집(S)... 버튼을 클릭합니다.


3) 오류가 난 사이트의 URL을 기입합니다. ex) http://127.0.0.1:8080/~~~~~~


728x90
반응형
728x90
반응형

자바 1.7버전 사용 중 1.8로 버전을 업데이트를 했습니다.

이클립스 실행 시 

Eclipse java was started but returned exit code=13

이와 같은 오류가 나타나며 이클립스가 실행이 되지 않네요.

1.8로 업데이트를 했지만 1.8자바 정보에 대한 방법이 없기 때문입니다.



해결방법은 2가지가 있습니다.


1. 제어판 자바 삭제 후 업데이트 했던 버전으로 자바를 새로 설치해줍니다.


2. eclipse.ini 파일 수정하기 


2-1) 우선 eclipse.ini 파일의 위치를 찾습니다.

본인이 설치한 이클립스 파일을 들어가면 아래와 같이 eclipse.ini 파일이 있습니다.




2-2) 에디터 프로그램으로 열어 자바 정보를 추가해줍니다.

저는 pc에 설치된 notepad 파일로 eclipse.ini 파일을 수정하였습니다.(notepad 설치 경로 http://notepad-plus-plus.org/ )

아래 사진과 같은 위치에


-vm

C:/Program Files/Java/jdk1.7.0_80/bin/javaw.exe 


를 추가해줍니다.

제 PC에 자바가 설치된 위치로 본인 PC에 자바가 설치한 경로를 수정해서 추가하면 됩니다.



이상입니다.



728x90
반응형
728x90
반응형

Ctril + Shift + R 단축키를 누르면 아래와 같은 화면이 나옵니다.


원하는 파일의 이름을 검색하면 해당하는 파일들이 리스트로 나오게 됩니다.

파일명이 생각나지 않는다면 *를 사용해 찾으면 됩니다. 

*는 모든 파일을 의미하는데 *.js*를 검색하게 된다면

*.js 파일과 *.jsp 파일을 모두 보여주게 됩니다.

728x90
반응형
728x90
반응형
Java SE(Standard Edition)
 자바 스탠다드 에디션은 가장 보편적으로 쓰이는 자바 API집합체입니다. 예전에는 J2SE로 불렸으나 버전 6.0이후에 Java SE로 변경되었습니다. 이전에는 썬 마이크로시스템즈에서 관리했으나 현재는 JCP 주도하에 개발되고 있습니다. 일반 자바 프로그램 개발을 위한 용도로 사용되며 스윙이나 AWT와 같은 GUI 방식의 기본 기능이 포함됩니다.

Java EE(Enterprise Edition)
 자바 엔터프라이즈 에디션은 자바를 이용한 서버측 개발을 위한 플랫폼입니다. Java EE는 표준 플랫폼인 Java SE를 사용하는 서버를 위한 플랫폼입니다. 엔터프라이즈 환경을 위한 도구로 EJB, JSP, Servlet, JNDI 같은 기능을 지원하며 WAS를 이용하는 프로그램 개발 시 사용됩니다.
 *EJB(Enterprise JavaBeans): 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다. 즉, EJB는 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션이다. EJB 사양은 Java EE의 자바 API 중 하나로, 주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리하는 역할을 한다.

Java ME(Micro Edition)
자바 마이크로 에디션은 제한된 자원을 가진 휴대폰, PDA, 셋탑박스 등에서 Java프로그래밍 언어를 지원하기 위해 만들어진 플랫폼입니다. 임베디드 시스템에서 자바로 프로그램을 개발할 떄 이용합니다.

SDK(Standard Development Kit or Softeware Development Kit)

 개발 언어의 소프트웨어 개발 킷으로, 프로그램을 개발하려면 개발하는 프로그램있어야 하는데 이를 의미합니다.


JDK(Java Development Kit)

 자바 개발을 위한 필수 도구입니다. JDK는 JRE를 포함하고 있습니다.


JRE(Java Runtime Environment)

 JDK로 만들어진 프로그램을 실행할 수 있도록 합니다. 파일 용량이 적은 대신 개발을 할 수 없습니다. 예를 들어 한글 뷰어의 경우 한글 파일을 읽을 수 있지만 작성하지는 못하는 기능과 비슷합니다.


JVM(Java Virtual Machine)

 자바가상머신의 약자로, 사용자가 자바 파일을 생성한 후 JDK의 컴파일을 커쳐 바이트 코드인 .class가 되어서 JVM을 거치면 컴퓨터가 사용할 수 있는 기계언어로 변경해주는 역할입니다.



728x90
반응형
728x90
반응형

아래와 같이 이클립스 콘솔창 한글 깨짐 현상 해결하는 방법에 대해 알아보겠습니다.


먼저 해당 프로젝트에 우클릭 후 Properties를 클립합니다. 후 Run - Run Configurations 클릭

혹은 아래 사진과 같이 메뉴에서 Run - Run Configurations 클릭


Common으로 들어가서 Default에서 Other로 변경해준 뒤 EUC-KR로 변경합니다.

한글 깨짐 현상이 해결되었습니다.


728x90
반응형
728x90
반응형

+ Recent posts