아이디와 비밀번호 암호화하기
[해야할 일]
(0) 라이브러리 설치
(1) ID와 비밀번호를 입력받을 View 생성
(2)AES256의 서비스 클래스 생성
(3)서비스 클래스를 사용할 Controller 생성
(4)servlet-context.xml에 서비스 클래스 빈 등록
(5)결과 응답 View 생성
(6)home.jsp에서 인덱스 생성
(0) 라이브러리 설치
에 접속해서 jce8을 다운로드 한다.
Accept License Agreement 후 Download.
압축을 풀면,
이 두 Jar 파일이 나온다.
(0)-1 Build Path - Configuration Build Path - Libraries - Add Library - Web App Libraries를 만든다. 그 후 ‘Add External Jars’로 저 두 파일을 Web App Libraries 안에 추가한다.
(0)-2 src - WEB-INF 안에 lib 파일을 만든 후 저 두 Jar 파일을 추가한다.
(0)-3 pom.xml에 commons-codec 라이브러리 추가
1
2
3
4
5
6
7
8
|
<!-- 08/03 양방향 암호화/복호화를 위한 설정 -->
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
|
(1) ID와 비밀번호를 입력받을 View 생성 [form.jsp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="post">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pwd"><br>
<input type="submit" value="로그인">
</form>
</body>
</html>
|
(2)AES256의 서비스 클래스 생성 [AES256Util.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
|
package com.bitcampi.mvc0803;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
* 양방향 암호화 알고리즘인 AES256 암호화를 지원하는 클래스
*/
public class AES256Util {
private String iv = "00000000000000001";
private Key keySpec;
/**
* 16자리의 키값을 입력하여 객체를 생성한다.
* @param key 암/복호화를 위한 키값
* @throws UnsupportedEncodingException 키값의 길이가 16이하일 경우 발생
*/
public AES256Util() throws UnsupportedEncodingException {
this.iv = iv.substring(0, 16);
byte[] keyBytes = new byte[16];
byte[] b = iv.getBytes("UTF-8");
int len = b.length;
if (len > keyBytes.length) {
len = keyBytes.length;
}
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
this.keySpec = keySpec;
}
/**
* AES256 으로 암호화 한다.
* @param str 암호화할 문자열
* @return
* @throws NoSuchAlgorithmException
* @throws GeneralSecurityException
* @throws UnsupportedEncodingException
*/
public String encrypt(String str) throws NoSuchAlgorithmException,
GeneralSecurityException, UnsupportedEncodingException{
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));
byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
String enStr = new String(Base64.encodeBase64(encrypted));
//import org.apache.commons.codec.binary.Base64;
return enStr;
}
/*복호화*/
/**
* AES256으로 암호화된 txt 를 복호화한다.
* @param str 복호화할 문자열
* @return
* @throws NoSuchAlgorithmException
* @throws GeneralSecurityException
* @throws UnsupportedEncodingException
*/
public String decrypt(String str) throws NoSuchAlgorithmException,
GeneralSecurityException, UnsupportedEncodingException {
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));
byte[] byteStr = Base64.decodeBase64(str.getBytes());
return new String(c.doFinal(byteStr), "UTF-8");
}
}
|
(3)서비스 클래스를 사용할 Controller 생성
본인은 만들기 귀찮아서 ‘[SpringFramework] 단방향 암호화_sha256’에서 사용하던
컨트롤러를 조금 바꿔주었다.
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
|
package com.bitcampi.mvc0803;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.NoSuchAlgorithmException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/login")
public class Sha256Controller {
/* @Autowired
Sha256 sha;*/
@Autowired
AES256Util aes;
@RequestMapping(method=RequestMethod.GET)
public String form() {
return "form";
}
@RequestMapping(method=RequestMethod.POST)
public String login(@RequestParam("id") String id, @RequestParam("pwd") String pwd, Model model) throws NoSuchAlgorithmException, UnsupportedEncodingException, GeneralSecurityException {
System.out.println("암호화 전 아이디 : " + id);
System.out.println("암호화 전 비밀번호 : " + pwd);
/* id = sha.encrypt(id);
pwd = sha.encrypt(pwd);*/
id = aes.encrypt(id);
pwd = aes.encrypt(pwd);
System.out.println("-----------------------------");
System.out.println("암호화 후 아이디 : " + id);
System.out.println("암호화 후 비밀번호 : " + pwd);
System.out.println("-----------------------------");
System.out.println("복호화 후 아이디 : " + aes.decrypt(id));
System.out.println("복호화 후 비밀번호 : " + aes.decrypt(pwd));
model.addAttribute("id", id);
model.addAttribute("pwd", pwd);
return "login";
}
}
|
(4)servlet-context.xml에 서비스 클래스 빈 등록
1
2
|
<!-- 양방향 암호화의 서비스 클래스 빈 등록 -->
<beans:bean id="AES256Util" class="com.bitcampi.mvc0803.AES256Util"/>
|
(5)결과 응답 View 생성
1
2
3
4
5
6
7
8
9
10
11
12
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> ${id} / ${pwd} </h1>
</body>
</html>
|
(5)home.jsp에서 인덱스 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
Spring MVC 2018/08/03
</h1>
<ul>
<li><a href="mail/simpleMail">메일 전송(SimpleMail)</a></li>
<li><a href="mail/htmlMail">메일 전송(HTMLMail)</a></li>
<li><a href="mail/fileMail">메일 전송(FileMail)</a></li>
<li><a href="login">로그인</a></li>
</ul>
</body>
</html>
|
결과)
안녕하세요 혹시 질문이 있는데 여쭤봐도 될까요??
답글삭제