반응형

* 필요 jar File

XStreamReq&xml2json.zip


TestMain.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import com.exam.domain.AuthKey;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;
 
import com.exam.domain.AuthKey;
import com.exam.util.xstream.Obj2Xml;
 
public class TestMain {
    public static void main(String[] args) throws JSONException{
        AuthKey authKey = new AuthKey();
        
        authKey.setPrimaryKey("key");
        authKey.setId("a001122334455");
        authKey.setProperty_1("pro1");
        authKey.setProperty_2("pro2");
        String xml = new Obj2Xml(authKey).toXml();
        System.out.println("===== XML OUT =====");
        System.out.println(xml);
        
        JSONObject jsonObj = XML.toJSONObject(xml);
        System.out.println("===== JSON OUT =====");
        System.out.println(jsonObj);
    }
}
cs

AuthKey.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.exam.domain;
 
public class AuthKey {
    private String primaryKey;
    private String id;
    private String property_1;
    private String property_2;
    public String getPrimaryKey() {
        return primaryKey;
    }
    public void setPrimaryKey(String primaryKey) {
        this.primaryKey = primaryKey;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getProperty_1() {
        return property_1;
    }
    public void setProperty_1(String property_1) {
        this.property_1 = property_1;
    }
    public String getProperty_2() {
        return property_2;
    }
    public void setProperty_2(String property_2) {
        this.property_2 = property_2;
    }
    @Override
    public String toString() {
        return "AuthKey [primaryKey=" + primaryKey + ", id=" + id
                + ", property_1=" + property_1 + ", property_2=" + property_2
                + "]";
    }
        
}
cs

Obj2Xml.java(Obj를 받아서 Xml(String)으로 변환)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.exam.util.xstream;
 
import com.exam.domain.AuthKey;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer;
 
public class Obj2Xml {
    private Object obj;
    
    public Obj2Xml(Object obj){
        this.obj = obj;
    }
    
    public String toXml(){
        String toXml;
        
        XmlFriendlyReplacer replacer = new XmlFriendlyReplacer("__","_");
        XStream xStream = new XStream(new DomDriver("UTF-8", replacer)){
            protected boolean useXStreamXmlFriendlyMapper() {
                return true;
            }
        };
        xStream.alias("AuthKey", AuthKey.class);
        toXml = xStream.toXML(obj);
        return toXml;
    }
    
}
cs

Result

1
2
3
4
5
6
7
8
9
===== XML OUT =====
 
  key
  a001122334455
  pro1
  pro2
 
===== JSON OUT =====
{"response":{"id":"a001122334455","property_1":"pro1","primaryKey":"key","property_2":"pro2"}}
cs

*****************************************************

*****************************************************

Xstream 을 사용할때 Obj 속성중 _ 가 있으면 __ 로 변환 되기 때문에 아래처럼 XmlStream을 선언하여 써야 한다.

참고

1
2
3
4
5
6
XmlFriendlyReplacer replacer = new XmlFriendlyReplacer("__","_");
        XStream xStream = new XStream(new DomDriver("UTF-8", replacer)){
            protected boolean useXStreamXmlFriendlyMapper() {
                return true;
            }
        };
cs


반응형

'IT > 언어' 카테고리의 다른 글

페이징 처리용 소스(예제?)  (0) 2014.07.08
POI Excel 파일 쓰기  (0) 2014.06.26
Mybatis + java 연동 기초  (0) 2014.06.19
JDBC 설정  (0) 2014.06.19
[MyBatis] SqlSessionFactory  (0) 2014.06.19
반응형

환경 : Win7, java7, Eclipse Kepler, Mysql 5.6, Mybatis 3.0.6

LIB : MyBatis + MysqlConnector

mybatis mysql.zip

1. 이클립스 Dynamic Web Project 생성

(프레임워크에 따라 다르기 때문에 Console까지만 구현)


2. 각 파일 생성


File Path<그림 1>


MyBatisConnectionFactory.java : SqlSessionFactory 를 생성, SqlMapConfig.xml 과 매핑

UserDAO.java : sqlSessionFactory를 통해 DB와 데이터 교환

User.java : User Bean

UserMapper.java : java 매핑용

UserMapper.xml : xml 매핑용

Test.java : Test용 main메소드(웹환경은 Servlet, Struts, Sping 알아서)

SqlMapConfig.xml : DB 정보, Mapper 정보 등록



3. 소스보기

test/Test.java

import com.exam.dao.UserDAO;
import com.exam.domain.user.User;

public class Test{

	public static void main(String[] args) {
		
			UserDAO dao = new UserDAO();
			User user = new User();
//			
//			user = dao.getUser(new String("kkk@digi.com"));
//			
//			System.out.println(user.toString());
			
			user.setEmail("kj@digi.com");
			user.setPassword("321321");
			user.setName("kj");
			user.setAge(27);
			
			dao.insert(user);
	}

}

com/exam/dao/MyBatisConnectionFactory.java

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.exam.mapper.user.UserMapper;

public class MyBatisConnectionFactory {
	private static SqlSessionFactory sqlSessionFactory;
	
	static{
		try{
			String resource = "SqlMapConfig.xml";
			Reader reader = Resources.getResourceAsReader(resource);
			if(sqlSessionFactory == null){
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, "development");
//				sqlSessionFactory.getConfiguration().addMapper(UserMapper.class);
			}
		}catch(FileNotFoundException e){
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionFactory;
	}
	
}


com/exam/dao/UserDAO.java

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.exam.domain.user.User;
import com.exam.mapper.user.UserMapper;

public class UserDAO {
	// UserMapper.xml 의 NameSpace
	private static final String NAMESPACE = "User.";
	
	// UserDAO가 호출될때 생성자를 통해 sqlSessionFactory 생성
	private SqlSessionFactory sqlSessionFactory;
	
	public UserDAO(){
		sqlSessionFactory = MyBatisConnectionFactory.getSqlSessionFactory();
	}
	
	// xml을 통한 매핑
	public void insert(User user){
		System.out.println("## UserDAO insert() 진입");
		// session Open
		SqlSession session = sqlSessionFactory.openSession();
		try{
			// UserMapper.xml => (NameSpace)User.(id)insert 에 user 객체 매칭 
			session.insert(NAMESPACE+"insert", user);
			// 커밋
			session.commit();
			System.out.println("## insert 성공");
		}catch(Exception e){
			session.rollback();
			e.printStackTrace();
			System.out.println("## insert 실패");
		}finally{
			// 사용후엔 닫아주자
			session.close();
		}
	}
	
	// java를 통한 매핑
	public User getUser(String email){
		SqlSession session = sqlSessionFactory.openSession();
		try{
			// 새로운 mapper를 생성
			UserMapper mapper = session.getMapper(UserMapper.class);
			User user = mapper.getUser(email);
			return user;
		}finally{
			session.close();
		}
	}
}

com/exam/domain/user/User.java

public class User {
	private Integer no;
	private String email;
	private String password;
	private String name;
	private Integer age;
	public Integer getNo() {
		return no;
	}
	public void setNo(Integer no) {
		this.no = no;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [no=" + no + ", email=" + email + ", password=" + password
				+ ", name=" + name + ", age=" + age + "]";
	}
	
	
}

com/exam/mapper/user/UserMapper.java

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.exam.domain.user.User;

public interface UserMapper {
	final String getUser = 
	"SELECT * FROM EXAM.USER " +
	"WHERE email = #{EMAIL}";
	
	// @Select(위의 String getUser 임)
	@Select(getUser)
	// property = User.java 의 속성, column = DB의 컬럼
	@Results(
			value={
					@Result(property="no", column="NO"),
					@Result(property="email", column="Email"),
					@Result(property="password", column="PASSWORD"),
					@Result(property="name", column="NAME"),
					@Result(property="age", column="AGE"),
			}
			)
	User getUser(String email); // email을 이용해 User 객체로 DB 결과값 리턴함
}


com/exam/mapper/user/UserMapper.xml

아래 xml 선언 포함 추가
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">


    
    
		INSERT INTO EXAM.USER
		(
			EMAIL
			,PASSWORD
			,NAME
			,AGE
		)values(
			#{email}
			,#{password}
			,#{name}
			,#{age}
		)
    



SqlMapConfig.xml

아래 xml 선언 포함 추가
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">


	
		
	
	
    
		
			
			
				
				
				
				
			
		
				
	
	
		
	




4. 대충의 순서



!!! XML 태그 대소문자 주의!!!(대문자가 소문자로 바뀌어있음...)

반응형

'IT > 언어' 카테고리의 다른 글

POI Excel 파일 쓰기  (0) 2014.06.26
XStream 사용(_ 중복 출력 해결) & XML to JSON  (0) 2014.06.20
JDBC 설정  (0) 2014.06.19
[MyBatis] SqlSessionFactory  (0) 2014.06.19
[LIB] ESAPI 로 XSS 방어  (0) 2014.05.30
반응형

주제


create table exam.user(
no int not null auto_increment,
email varchar(30) not null,
password varchar(20) not null,
name varchar(10),
age int(10),
primary key(no, email)
);

반응형

'IT > DB' 카테고리의 다른 글

몽고DB 기본 명령  (0) 2013.11.26
MongoDB 설치  (0) 2013.11.26
반응형

Oracle

1
2
3
4
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@{ip}:1521:VSWUD" />
<property name="username" value="{id}" />
<property name="password" value="{password}" />
cs

MySQL

1
2
3
4
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:mysql://{ip}:3306/{dbName}"/>
<property name="JDBC.Username" value="{id}"/>
<property name="JDBC.Password" value="{password}"/>
cs



반응형

'IT > 언어' 카테고리의 다른 글

XStream 사용(_ 중복 출력 해결) & XML to JSON  (0) 2014.06.20
Mybatis + java 연동 기초  (0) 2014.06.19
[MyBatis] SqlSessionFactory  (0) 2014.06.19
[LIB] ESAPI 로 XSS 방어  (0) 2014.05.30
시큐어 코딩 가이드  (0) 2014.05.29
반응형
SqlSessionFactory

SqlSessionFactory 는 SqlSession 인스턴스를 생성하기 위해 사용할 수 있는 6개의 메소드를 가지고 있다.

6개의 메소드가 선택해서 사용하는 것들을 보자.

⊙ Transaction : 세션에서 트랜잭션 스코프 또는 자동 커밋을 사용하고 싶은가?

⊙ Connection : 설정된 DataSource 에서 Connection 을 획득하고 싶은가?

⊙ Excution : PreparedStatements 그리고/또는 배치(Insert, Delete 를 포함해서) 업데이트를 재사용 하고 싶은가?

오버로드된 메소드인 openSession()이 3가지를 적절히 혼합해서 사용할 수 있다.

SqlSession openSession();

SqlSession openSession(boolean autoCommit);

SqlSession openSession(Connection connection);

SqlSession openSession(TranseactionIsolationLevel level);

SqlSession openSession(ExecutorTye execType,);

SqlSession openSession(ExecutorTye execType, TranseactionIsolationLevel level);

SqlSession openSession(ExecutorTye execType, boolean autoCommit);

SqlSession openSession(ExecutorTye execType,Connection connection);

Configuration getConfiguration();


파라미터를 가지지 않는 디폴트 openSession() 메소드는 다음과 같은 성격을 가진 SqlSession을 만들것이다.

☞  트랜잭션 스코프는 시작될 것이다.

☞  Connection 객체는 활성화된 환경에 의해 설정된 DataSource 인스턴스를 획득 할 것이다.

☞  트랜잭션 격리 레벨은 드라이버나 데이터소스가 디폴트로 제공하는 옵션을 사용할 것이다.

☞  PreparedStatements는 재사용되지 않을 것이다. 그리고 update 또한 배치 처리 되지 않을 것이다.

메소드 대부분은 그 이름과 파라미터가 그 역할을 충분히 설명한다. 자동커밋을 활성화 하기 위해서, autoCommit 파라미터에 "true" 값을 셋팅하라. 자체적인 커넥션을 제공하기 위해서는 connection 파라미터에 Connection 인스턴스를 셋팅하라.

Connection 과 autoCommit 둘다 셋팅하는 것은 오버라이드 하지 않는다. 왜냐하면 MyBatis는 제공된 connection 객체를 셋팅할 때마다 현재 사용중인 것을 사용한다. MyBatis는 TransactionIsolationLevel 이라고 불리는 트랜잭션 격리 레벨을 위한 자바 enum 래퍼를 사용한다. JDBC를 5가지를 지우너한다(NONE, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE)

새롭게 보일수 있는 하나의 파라미터는 ExecutorType 이다. enum으로는 3개의 값을 정의한다.

ExecutorType.SIMPLE

이 타입의 실행자는 아무것도 하지 않는다. 구문은 실행마다 새로운 PreparedStatement 를 생성한다.

ExecutorType.REUSE

이 타입의 실행자는 PreparedStatement 를 재사용할 것이다.

ExecutorType.BATCH

이 실행자는 모든 update 구문을 배치처리하고 중간에 select 가 실행될 경우 필요하다면 경계를 표시한다. 이러한 과정은 행위를 좀더 이해하기 쉽게 하기 위함이다.

→NOTE : SqlSessionFactory 에서 언급하지 않는 한개 이상의 메소드가 있다. getConfiguration() 메소드 인데. 이 메소드는 런타임시 MyBatis 설정을 조사하는 Configuration 인스턴스를 리턴할 것이다.


반응형

'IT > 언어' 카테고리의 다른 글

Mybatis + java 연동 기초  (0) 2014.06.19
JDBC 설정  (0) 2014.06.19
[LIB] ESAPI 로 XSS 방어  (0) 2014.05.30
시큐어 코딩 가이드  (0) 2014.05.29
ByteUtil.java  (0) 2014.05.29
반응형

참고 : http://airlee00.blogspot.kr/2013/11/esapi-xss-sql-injection.html

esapi-2.1.0.jar

esapi-2.1.0.jar

소스코드 일부

1
2
3
4
5
6
7
8
9
10
11
12
13
// board.content 에 <script>alert("1");<script> 저장
public Board setBoard(Board board, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    try{
        board.setName(request.getParameter("name"));
        board.setPassword(request.getParameter("password"));
        board.setTitle(request.getParameter("title"));
//        board.setContent(request.getParameter("content")); // 필터 없이 그대로 저장
        board.setContent(ESAPI.encoder().encodeForHTML(request.getParameter("content"))); // <. >, ", (,),/ 필터링 후 저장
    }catch(NullPointerException e){
        error("Null 값이 있습니다.", request, response);
    }
    return board;
}
cs

ESAPI.properties

1
2
3
4
5
Authenticator.UsernameParameterName=userName
Authenticator.PasswordParameterName=password
ESAPI.Authenticator=com.esapi.authenticator.CustomAuthenticator
Authenticator.IdleTimeoutDuration=100000
Authenticator.AbsoluteTimeoutDuration=100000
cs


반응형

'IT > 언어' 카테고리의 다른 글

JDBC 설정  (0) 2014.06.19
[MyBatis] SqlSessionFactory  (0) 2014.06.19
시큐어 코딩 가이드  (0) 2014.05.29
ByteUtil.java  (0) 2014.05.29
RSA 암호화  (0) 2014.05.29
반응형

안행부 링크

반응형

'IT > 언어' 카테고리의 다른 글

[MyBatis] SqlSessionFactory  (0) 2014.06.19
[LIB] ESAPI 로 XSS 방어  (0) 2014.05.30
ByteUtil.java  (0) 2014.05.29
RSA 암호화  (0) 2014.05.29
Servlet Encoding Filter  (0) 2014.05.21
반응형

ByteUtil.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
public class ByteUtil {
 
    //public static Byte DEFAULT_BYTE = new Byte((byte) 0);
 
    /**
     * 문자열을 바이트로 변환한다.
     * 
     *  ByteUtils.toByte("1", *) = 0x01 ByteUtils.toByte("-1", *) = 0xff
     *  ByteUtils.toByte("a", 0x00) = 0x00 
     * 
     * @param value 10진수 문자열 값
     * @param defaultValue
     * @return
     */
    public static byte toByte(String value, byte defaultValue) {
        try {
            return Byte.parseByte(value);
        }
        catch (Exception e) {
            return defaultValue;
        }
    }
 
    /**
     * 문자열을 바이트로 변환한다.
     * 
     * ByteUtils.toByteObject("1", *) = 0x01 
     * ByteUtils.toByteObject("-1", *) = 0xff 
     * ByteUtils.toByteObject("a", 0x00) = 0x00  
     * 
     * @param value 10진수 문자열 값
     * @param defaultValue
     * @return
     */
    public static Byte toByteObject(String value, Byte defaultValue) {
        try {
            return new Byte(value);
        }
        catch (Exception e) {
            return defaultValue;
        }
    }
 
    /**
     * singed byte를 unsinged byte로 변환한다. 
     * Java에는 unsinged 타입이 없기때문에, 
     * int로 반환한다.(b & 0xff)
     * 
     * @param b singed byte
     * @return unsinged byte
     */
    public static int unsignedByte(byte b) {
        return b & 0xFF;
    }
 
    /**
     * 입력한 바이트 배열(4바이트)을 int 형으로 변환한다.
     * 
     * @param src
     * @param srcPos
     * @return
     */
    public static int toInt(byte[] src, int srcPos) {
        int dword = 0;
        for (int i = 0; i < 4; i++) {
            dword = (dword << 8+ (src[i + srcPos] & 0xFF);
        }
        return dword;
    }
 
    /**
     * 입력한 바이트 배열(4바이트)을 int 형으로 변환한다.
     * 
     * @param src
     * @return
     */
    public static int toInt(byte[] src) {
        return toInt(src, 0);
    }
 
    /**
     * 입력한 바이트 배열(8바이트)을 long 형으로 변환한다.
     * 
     * @param src
     * @param srcPos
     * @return
     */
    public static long toLong(byte[] src, int srcPos) {
        long qword = 0;
        for (int i = 0; i < 8; i++) {
            qword = (qword << 8+ (src[i + srcPos] & 0xFF);
        }
        return qword;
    }
 
    /**
     * 입력한 바이트 배열(8바이트)을 long 형으로 변환한다.
     * 
     * @param src
     * @return
     */
    public static long toLong(byte[] src) {
        return toLong(src, 0);
    }
 
    /**
     * int 형의 값을 바이트 배열(4바이트)로 변환한다.
     * 
     * @param value
     * @param dest
     * @param destPos
     */
    public static void toBytes(int value, byte[] dest, int destPos) {
        for (int i = 0; i < 4; i++) {
            dest[i + destPos] = (byte) (value >> ((7 - i) * 8));
        }
    }
 
    /**
     * int 형의 값을 바이트 배열(4바이트)로 변환한다.
     * 
     * @param value
     * @return
     */
    public static byte[] toBytes(int value) {
        byte[] dest = new byte[4];
        toBytes(value, dest, 0);
        return dest;
    }
 
    /**
     * long 형의 값을 바이트 배열(8바이트)로 변환한다.
     * 
     * @param value
     * @param dest
     * @param destPos
     */
    public static void toBytes(long value, byte[] dest, int destPos) {
        for (int i = 0; i < 8; i++) {
            dest[i + destPos] = (byte) (value >> ((7 - i) * 8));
        }
    }
 
    /**
     * long 형의 값을 바이트 배열(8바이트)로 변환한다.
     * 
     * @param value
     * @return
     */
    public static byte[] toBytes(long value) {
        byte[] dest = new byte[8];
        toBytes(value, dest, 0);
        return dest;
    }
 
    /**
     * 8, 10, 16진수 문자열을 바이트 배열로 변환한다. 
     * 8, 10진수인 경우는 문자열의 3자리가, 16진수인
     * 경우는 2자리가, 하나의 byte로 바뀐다.
     * 
     * ByteUtils.toBytes(null) = null
     * ByteUtils.toBytes("0E1F4E", 16) = [0x0e, 0xf4, 0x4e] 
     * ByteUtils.toBytes("48414e", 16) = [0x48, 0x41, 0x4e]
     * 
     * 
     * @param digits 문자열
     * @param radix 진수(8, 10, 16만 가능)
     * @return
     * @throws NumberFormatException
     */
    public static byte[] toBytes(String digits, int radix) throws IllegalArgumentException, NumberFormatException {
        if (digits == null) { return null; }
        if (radix != 16 && radix != 10 && radix != 8) { throw new IllegalArgumentException("For input radix: \"" + radix + "\""); }
        int divLen = (radix == 16) ? 2 : 3;
        int length = digits.length();
        if (length % divLen == 1) { throw new IllegalArgumentException("For input string: \"" + digits + "\""); }
        length = length / divLen;
        byte[] bytes = new byte[length];
        for (int i = 0; i < length; i++) {
            int index = i * divLen;
            bytes[i] = (byte) (Short.parseShort(digits.substring(index, index + divLen), radix));
        }
        return bytes;
    }
 
    /**
     * 16진수 문자열을 바이트 배열로 변환한다. 
     * 문자열의 2자리가 하나의 byte로 바뀐다.
     * 
     * ByteUtils.hexStringToBytes(null) = null
     * ByteUtils.hexStringToBytes("0E1F4E") = [0x0e, 0xf4, 0x4e]
     * ByteUtils.hexStringToBytes("48414e") = [0x48, 0x41, 0x4e] 
     * 
     * @param digits 16진수 문자열
     * @return
     * @throws NumberFormatException
     * @see HexUtils.toBytes(String)
     */
    public static byte[] hexStringToBytes(String digits) throws IllegalArgumentException, NumberFormatException {
        if (digits == null) { return null; }
        int length = digits.length();
        if (length % 2 == 1) { throw new IllegalArgumentException("For input string: \"" + digits + "\""); }
        length = length / 2;
        byte[] bytes = new byte[length];
        for (int i = 0; i < length; i++) {
            int index = i * 2;
            bytes[i] = (byte) (Short.parseShort(digits.substring(index, index + 2), 16));
        }
        return bytes;
    }
 
    /**
     * unsigned byte(바이트)를 16진수 문자열로 바꾼다.
     * 
     * ByteUtils.toHexString((byte)1) = "01" 
     * ByteUtils.toHexString((byte)255) = "ff"
     * 
     * @param b unsigned byte
     * @return
     * @see HexUtils.toString(byte)
     */
    public static String toHexString(byte b) {
        StringBuffer result = new StringBuffer(3);
        result.append(Integer.toString((b & 0xF0>> 416));
        result.append(Integer.toString(b & 0x0F16));
        return result.toString();
    }
 
    /**
     * unsigned byte(바이트) 배열을 16진수 문자열로 바꾼다.
     * 
     * ByteUtils.toHexString(null) = null
     * ByteUtils.toHexString([(byte)1, (byte)255]) = "01ff" 
     * 
     * @param bytes unsigned byte's array
     * @return
     * @see HexUtils.toString(byte[])
     */
    public static String toHexString(byte[] bytes) {
        if (bytes == null) { return null; }
 
        StringBuffer result = new StringBuffer();
        for (byte b : bytes) {
            result.append(Integer.toString((b & 0xF0>> 416));
            result.append(Integer.toString(b & 0x0F16));
        }
        return result.toString();
    }
 
    /**
     * 두 배열의 값이 동일한지 비교한다.
     * 
     * ArrayUtils.equals(null, null) = true
     * ArrayUtils.equals(["one", "two"], ["one", "two"]) = true 
     * ArrayUtils.equals(["one", "two"], ["three", "four"]) = false
     * 
     * @param array1
     * @param array2
     * @return 동일하면 true, 아니면 false
     */
    public static boolean equals(byte[] array1, byte[] array2) {
        if (array1 == array2) { return true; }
 
        if (array1 == null || array2 == null) { return false; }
 
        if (array1.length != array2.length) { return false; }
 
        for (int i = 0; i < array1.length; i++) {
            if (array1[i] != array2[i]) { return false; }
        }
 
        return true;
    }
}
cs


반응형

'IT > 언어' 카테고리의 다른 글

[LIB] ESAPI 로 XSS 방어  (0) 2014.05.30
시큐어 코딩 가이드  (0) 2014.05.29
RSA 암호화  (0) 2014.05.29
Servlet Encoding Filter  (0) 2014.05.21
정규 표현식 예제  (0) 2014.05.21
반응형
ByteUtil.java

해당 소스에 사용된 ByteUtil 클래스

TestRsa.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
 
public class TestRsa {
    public static void main(String[] args) 
           throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        SecureRandom random = new SecureRandom();
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
        generator.initialize(2048, random);
 
        KeyPair pair = generator.generateKeyPair();
        Key publicKey = pair.getPublic();
        System.out.println("publicKey = " + publicKey);
 
        Key privateKey = pair.getPrivate();
        System.out.println("privateKey = " + privateKey);
 
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey, random);
        
        String text = "RSA 암호화!!";
        System.out.println("원본 : " + text);
 
        // String -> byte 변환
        byte[] t0 = text.getBytes();
        System.out.println("원본 바이트 : " + ByteUtil.toHexString(t0));
        
 
        // 인코딩
        byte[] b0 = cipher.doFinal(t0);
        System.out.println("인코딩 : " + ByteUtil.toHexString(b0));
        
        // 디코딩
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] b1 = cipher.doFinal(b0);
        
        System.out.println("디코딩 : " + ByteUtil.toHexString(b1));
        System.out.println("디코딩된 원본:" + new String(b1));
    }
}
cs

########### Console 결과 ###########

1
2
3
4
5
6
7
8
9
publicKey = Sun RSA public key, 2048 bits
  modulus: 24375096591711126055210512185359957069059389332115666685656256009167572767173223522908531449043521360276825613201726594898353846423279278285747007266846094212573914607322409575412719234320181695009686453504284619499201124842375042929556510354483722116550582489225345515352818937465595047638810682064411880791025358297049816845633188104939146545275383717858564379062518328967892129218263037788613461088589973921632894302911326334363077605546489131720190553333874412384419644166222126318457219924457347665925613430947371080765753200018907246728766599325596504477911485731278280070273136297987513034643007577899945186837
  public exponent: 65537
privateKey = sun.security.rsa.RSAPrivateCrtKeyImpl@ffc92d04
원본 : RSA 암호화!!
원본 바이트 : 52534120ec9594ed98b8ed99942121
인코딩 : 1556d68e09e782fd67d3d7413f535ca829526ba33ff7869d4c9a75d4ce5e0cf30333c390f01305041ad86fad071b6e5c935d47edbc2b4acd314f7adc54db6916dbe1bb48708d16adf0927aeb3f8b1a4461d15c34c74ce72dff5125ab66324db15630d9b59ca1bb2e205d656dff38461c282475035fed2095872971bb8f961cce2b2fa797b389d6a18704f2d8204510d819dcc2ccd05597fd5b04536d76698a15cf05f5800cbd86f5016916393b2fd5fbaa935b138f57ebff7825ae6812ebe41f1cc357fb33a62c55d23ad7d3ca3fb8ebeaa651f4842209b0e0128cda6520d1fe9e37af678e2a515eec9e79be6b480e2786c4fc42a23c4846a94d35ff105dd7c7
디코딩 : 52534120ec9594ed98b8ed99942121
디코딩된 원본:RSA 암호화!!
cs


반응형

'IT > 언어' 카테고리의 다른 글

시큐어 코딩 가이드  (0) 2014.05.29
ByteUtil.java  (0) 2014.05.29
Servlet Encoding Filter  (0) 2014.05.21
정규 표현식 예제  (0) 2014.05.21
Servlet 에러 페이지 처리  (0) 2014.05.21
반응형

EncodingFilter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CommonEncodingFilter implements Filter {
    private String encoding = null;
    protected FilterConfig filterConfig = null;
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
    }
 
   public void destroy() {
        this.encoding = null;
        this.filterConfig = null;
   }
 
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
   throws IOException, ServletException {
        if (request.getCharacterEncoding() == null) {
            if (encoding != null) {
                request.setCharacterEncoding(encoding);
            }
        }
        chain.doFilter(request, response);
   }
 
    public FilterConfig getFilterConfig() {
        return filterConfig;
    }
 
    public void setFilterConfig(FilterConfig cfg) {
        filterConfig = cfg;
    }
}
cs

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<filter>
    <filter-name>Encoding Filter</filter-name>
    <filter-class>com.exam.common.CommonEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Encoding Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
 
cs


반응형

'IT > 언어' 카테고리의 다른 글

ByteUtil.java  (0) 2014.05.29
RSA 암호화  (0) 2014.05.29
정규 표현식 예제  (0) 2014.05.21
Servlet 에러 페이지 처리  (0) 2014.05.21
Jquery validation  (0) 2014.05.21

+ Recent posts