김은옥씨가 지은 은노기의 JSP2.3 웹프로그래밍에 나오는 shoppingmall 프로그램을 돌려보기 위한 참고사항을 적어본다.

소스코드는 아래에 첨부한다.

shoppingmall.zip
3.43MB

이 프로그램은 데이터베이스로 MySQL을 사용하였다. 나는 v8.0.13을 사용하였다.

위 소스코드 중 WebContent/WEB-INF/sql/database.sql 파일을 참조한다.

다음과 같이 데이터베이스 및 사용자를 생성하고 권한을 부여해준다. (root 권한으로 실행한다.)

-- 은노기 shoppingmall 프로젝트
create database jsptest;
create user 'jspid'@'localhost' identified by 'jsppass';
create user 'jspid'@'%' identified by 'jsppass';
grant all privileges on jsptest.* to 'jspid'@'localhost';
grant all privileges on jsptest.* to 'jspid'@'%';
commit;

다음과 같이 테이블과 사용자 데이터를 추가한다.

create table member(
  id varchar(50) not null primary key,
  passwd varchar(16) not null,
  name varchar(10) not null,
  reg_date datetime not null
);

alter table member
     add (address varchar(100) not null,
          tel varchar(20) not null);
          
desc member;

insert into member(id, passwd, name, reg_date, address, tel) 
values('kingdora@dragon.com','1234','김개동', now(), '서울시', '010-1111-1111');

insert into member(id, passwd, name, reg_date, address, tel) 
values('hongkd@aaa.com','1111','홍길동', now(), '경기도', '010-2222-2222');

select * from member;

alter table member modify passwd varchar(60) not null;

create table board(
  num int not null primary key auto_increment,
  writer varchar(50) not null,
  subject varchar(50) not null,
  content text not null,
  passwd varchar(60) not null,
  reg_date datetime not null,
  ip varchar(30) not null,
  readcount int default 0,
  ref int not null,
  re_step smallint not null,
  re_level smallint not null
);

desc board;

--쇼핑몰

create table manager(
 managerId varchar(50) not null primary key,
 managerPasswd varchar(60) not null
);

insert into manager(managerId,managerPasswd)
values('bookmaster@shop.com','123456');

insert into manager(managerId,managerPasswd)
values('ksseo63@naver.com','ekffksxm0');

create table book(
  book_id int not null primary key auto_increment,
  book_kind varchar(3) not null,
  book_title varchar(100) not null,
  book_price int not null,
  book_count smallint not null,
  author varchar(40) not null,
  publishing_com varchar(30) not null,
  publishing_date varchar(15) not null,
  book_image varchar(16) default 'nothing.jpg',
  book_content text not null,
  discount_rate tinyint default 10,
  reg_date datetime not null
);

create table qna(
  qna_id int not null primary key auto_increment,
  book_id int not null,
  book_title varchar(100) not null,
  qna_writer varchar(50) not null,
  qna_content text not null,
  group_id int not null,
  qora tinyint not null,
  reply tinyint default 0,
  reg_date datetime not null
);

create table bank(
  account varchar(30) not null,
  bank varchar(10) not null,
  name varchar(10) not null
);

insert into bank(account, bank, name)
values('11111-111-11111','내일은행','오내일');

create table cart(
  cart_id int not null primary key auto_increment,
  buyer varchar(50) not null,
  book_id int not null,
  book_title varchar(100) not null,
  buy_price int not null,
  buy_count tinyint not null,
  book_image varchar(16) default 'nothing.jpg'
);

create table buy(
  buy_id bigint not null,
  buyer varchar(50) not null,
  book_id varchar(12) not null,
  book_title varchar(100) not null,
  buy_price int not null,
  buy_count tinyint not null,
  book_image varchar(16) default 'nothing.jpg',
  buy_date datetime not null,
  account varchar(50) not null,
  deliveryName varchar(10) not null,
  deliveryTel varchar(20) not null,
  deliveryAddress varchar(100) not null,
  sanction varchar(10) default '상품준비중'
);

데이터베이스 연동을 위한 설정은 WebContent/META-INF/context.xml을 참조한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxWait="5000" name="jdbc/eun" password="jsppass" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/jsptest?useSSL=false" username="jspid"/>
</Context>

또한 MySQL JDBC Connector 파일도 자신이 사용하는 MySQL Server 버전에 맞추어 변경해 주어야 한다. 이것은 studyjsp와 shoppingmall 프로젝트의 WebContent/WEB-INF/lib 폴더 밑에 있는 JDBC Connecctor 라이브러리에 대하여 맞추어 주어야 한다. 나는 v8.0.13을 사용하므로 mysql-connector-java-8.0.13.jar로 변경해 주었다. (기존에는 5.x.x 버전을 사용)

사용자에 대한 암호를 암호화하기 위해서는 9장에 있는 cryptProcess.jsp를 구동해 주어야 한다. (http://localhost:8080/shoppingmall/ch09/cryptProcess.jsp)

이는 studyjsp 프로젝트 폴더에 있는 소스코드를 shoppingmall 프로젝트 폴더로 복사하여 사용하였다.

은노기의 JSP2.3 웹프로그래밍 9장 375p에 자세한 설명이 되어 있다.

다음은 ch09/cryptProcess.jsp 파일에 대한 내용이다.

<%@page import="ch09.update.UpdateDBBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.util.List" %>
<meta name="viewport" content="width=device-width,initial-scale=1.0"/>
<link rel="stylesheet" href="style.css"/>

<h3>암호화 전 내용</h3>
<jsp:include page="cryptProcessList.jsp" flush="false"/>

<%
  UpdateDBBean dbPro = UpdateDBBean.getInstance();
  dbPro.updateMember();
%>

<h3>암호화가 적용된 후 내용</h3>
<jsp:include page="cryptProcessList.jsp" flush="false"/>

또한 관리자 계정의 비밀번호도 암호화를 수행하여야 하며, 브라우저에서http://localhost:8080/shoppingmall/enc/cryptProcess.jsp를 수행하면 된다.

cryptProcess.jsp에 대한 소스 코드는 아래와 같다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.util.List" %>
<%@ page import = "mngr.enc.PassCrypt" %>
<meta name="viewport" content="width=device-width,initial-scale=1.0"/>

<%
  PassCrypt dbPro = PassCrypt.getInstance();
  dbPro.cryptProcess();
  out.println("암호화 성공! 꼭 한번만 수행");
%>
 

소스코드에 대한 동작을 확인하기 위해서는 관리자로 로그인하여 책에 대한 상품등록을 카테고리별로 3권씩 등록을 해주면 좋을 것 같다. (인터파크 등을 참고하면 쉽게 할 수 있음)

Posted by 세상을 살아가는 사람
,

암호화/복호화

웹개발 2015. 7. 25. 18:28

은노기의 블록암호에 대한 부분을 보다가

서버에 저장되는 데이터를 암호화해서 저장하거나 다시 역으로 복호화하는 과정에 대하여 공부를 하게 되었다.

- 암호화 과정

  신용카드번호와 같은 정보를 암호화 알고리즘을 사용하여 암호화를 한후 저장하고

- 복호화 과정

  암호화된 정보를 사용하여 복호화 알고리즘을 통하여 복호화를 함으로써 원래 정보인 신용카드번호를 알아낸다.


우리는 인터넷뱅킹을 할 때, 공인인증서를 발급받아 인터넷뱅킹의 서버로부터 휴대폰으로 인증서를 다운받는다. 이와 같이 인터넷뱅킹 서버와 휴대폰간에 키를 공유하게 된다.

또한 우리는 인증서가 노춛되었다거나 다른 사람이 인증서를 주었다고 하여 그대로 사용할 수 있는 것이 아니다. 인증암호가 별도로 있기 때문인데, 이것은 이전에 기술한 비밀번호 저장과 같이 자신의 인증번호로 다시 암호화를 하기 때문이다.


은노기에서는 KISA에서 제공하는 SEED 알고리즘을 사용하여 암호화 및 복호화를 한다.

신용카드 정보와 비밀키를 사용하여 SEED 알고리즘을 돌려 암호화된 신용카드 정보를 생성한 후 저장하게 된다.


config.jsp : ket.dat에 대한 경로를 저장하는데 full path를 지정해 주어야 한다.

Posted by 세상을 살아가는 사람
,

오늘은 은노기의 JSP2.3 웹프로그래밍을 공부를 하다가

회원관리 프로그램의 데이터베이스 테이블 중 비밀번호 부분을 암호화하는 절차를 기술하고자 한다.

참조 : 은노기 JSP2.3 웹프로그래밍 372p


입력받은 비밀번호와 Private 키를 사용하여 SHA-256 해시함수를 돌린다.

해시함수의 결과로 생성된 암호화된 비밀번호를 다시 bcript를 사용하여 해시함수를 돌린다.

그러면 60 바이트의 암호화된 비밀번호가 생성이 된다.


해시함수의 특성상 암호화된 비밀번호가 알려주더라고 원래의 비밀번호를 다시 알아낼 수가 없다.

따라서 비밀번호의 노출을 방지할 수 있다. 즉, 시스템에는 원래 사용자가 설정한 비밀번호는 저장이 되지 않고, 해시함수를 통해 생성된 암호화된 비밀번호만이 저장되기 때문에 운영자들도 사용자가 설정한 비밀번호를 알수가 없으며, 비밀번호의 분실시에는 다시 새로운 비밀번호를 사용자가 설정하도록 함으로써 비밀번호의 보안을 유지한다.

Posted by 세상을 살아가는 사람
,