A Hacker Next Door

Your Secrets 암호화 사이트 제작

Category: Coding
Tag: Encryption

yoursecrets.xyz 암호화 사이트를 제작했습니다! 코드는 깃허브에 업로드 되었으니 확인 부탁드립니다.


목차

  1. 사이트 소개
  2. 웹사이트 제작 방식
  3. 암호화 종류 소개
  4. 사이트 암복호화 방식
  5. 한계점


1. 사이트 소개

암호화 복호화 사이트입니다. 메인화면에서 “Upload”버튼을 누르면 패스워드와 업로드할 텍스트를 입력할 수 있는 업로드 페이지로 넘어갑니다. 패스워드와 텍스트를 입력한 후 업로드 버튼을 누르면 다음과 같은 ID값을 부여받게 됩니다 :

ID 값을 부여받았다면 메인 페이지에서 패스워드와 부여받은 ID값을 입력합니다.

“Decrypt” 버튼을 누르면 다음과 같이 해독이 됩니다 :

“Delete”버튼을 누르고 패스워드와 ID값을 다시 한번 입력하면 글을 지울 수 있습니다.

사이트 접속하셔서 메인화면의 “Notice!”, “Tips”, “Encryptions” 버튼도 클릭해보세요 ~ : yoursecrets.xyz


2. 웹사이트 제작 방식

APM기반의 웹호스팅 서비스를 받아 제작했습니다. 도메인은 GoDaddy.com에서 구입했습니다.

도메인을 구입한 후, 카페24와 고대디의 네임서버를 연결해서 사용했습니다.

웹사이트는 반응형으로 제작하여 웹페이지가 보여지는 환경에 맞출 수 있도록 했습니다. 반응형 CSS코드의 예시는 다음과 같습니다 :

.header {
	font-size: 5vw;
}

헤더의 폰트사이즈를 5vw로 설정하여 브라우저의 크기에 따라 사이즈가 변하도록 했습니다.

textarea {
	width:90%;
}

브라우저 크기에 따라 div의 크기가 달라지고, 해당 div안에 있는 textarea의 크기 역시 div의 90%의 길이로 달라집니다.

@media only screen and (max-width:620px) {
  /* For mobile phones: */
	textarea {
		width:100%;
	}
}

모바일 환경의 경우에는 textarea의 크기를 90%가 아니라 100%의 비율로 달라지게 설정할 수 있습니다.


3. 암호화 종류 소개

– 해싱(Hashing)

해싱은 평문을 암호화하는 것은 가능하지만, 암호문을 평문으로 복호화하는 것은 불가능한 단방향 암호화 알고리즘 입니다.
MD4, MD5, SHA0, SHA1, SHA2(SHA-256, SHA-512) 등의 알고리즘이 있습니다.

해싱은 주로 비밀번호 암호화할 때 쓰입니다. 해싱을 할 때에는 별도의 키가 필요하지 않기 때문입니다. 그래서 해싱된 비밀번호를 데이터베이스에 저장하고, 입력 값으로 들어온 평문 비밀번호를 해싱해 이 두개의 암호화된 값을 비교하는 방식으로 이용됩니다. 제 사이트에서는 SHA-512알고리즘이 쓰였습니다.
비밀번호 암호화 말고도 블록체인에서도 해싱이 쓰입니다. 주로 블록이 하나 올라갈 때 그 블록에 서명하는 용도로 쓰입니다.

– 대칭키 암호화 방식(Symmetric Encryption)

암호화와 복호화할 때 같은 키가 이용되는 방식입니다.
DES, 3DES, AES 등의 알고리즘이 있습니다.
가장 직관적으로 이해할 수 있는 방식입니다.

– 비대칭키 암호화 방식(Asymmetric Encryption)

암호화할 때의 키와 복호화할 때의 키가 서로 다른 방식입니다.
RSA 알고리즘이 가장 유명합니다.

각자 개개인은 비밀로 간직하고 있는 개인키를 갖고 있고, 남들도 볼 수 있는 공개키도 갖고 있습니다. 그리고 메시지는 개인키와 공개키 한쌍으로 암복호화를 할 수 있습니다. 즉, 개인키로 암호화된 암호문을 공개키로 복호화할 수 있고, 역으로 공개키로 암호화된 암호문은 개인키로 복호화할 수 있다는 것 입니다.

아래의 왼쪽 도식부터 설명해보자면, 밥이란 사람이 앨리스에게 메시지를 전달하려고 하는 상황을 가정해 봅시다. 암복호화를 하려면 개인키와 공개키 한 쌍을 이용해야하므로, 밥은 앨리스의 공개키를 이용해 메시지를 암호화하고 앨리스는 밥에게서 받은 메시지를 자신의 개인키를 이용해 해독하게되는 방식입니다.

오른쪽 도식의 경우에는, 앨리스가 밥에게 메시지를 보내는데 앨리스 본인이 보냈다는 것을 인증하는 것이 중요한 경우 입니다. 앨리스가 자신의 개인키로 암호화한 암호문을 밥에게 보내면 밥이 앨리스의 공개키로 해독하는 원리입니다. 누구나 볼 수 있는 공개키로 암호문을 해독할 수 있으므로, 암호화하는데 자체에 목적이 있기보다 누가 보냈는지 확인할 목적으로 사용되는 방식이라고 할 수 있습니다.

사진 출처 : 위키피디아


4. 사이트 암복호화 방식

your secrets 웹사이트에서 사용되는 mysql의 데이터베이스는 ‘Encs’라는 테이블을 가지고 있고 해당 테이블에는 ‘id’, ‘ti’, ‘k’, ‘essay’라는 애트리뷰트가 있습니다.

‘id’는 글번호이고 기본키이며 랜덤으로 생성됩니다.
‘ti’는 글쓴시각의 시간정보를 저장합니다.
‘k’는 사용자가 입력한 패스워드에 시간정보를 더한 값의 해시값입니다.
‘essay’는 사용자가 입력한 글의 암호문 입니다.

글이 암호화되고 복호화되는 메커니즘을 도식화하면 다음과 같습니다 :

암호화

글이 암호화 되는 과정 입니다:

  1. Upload페이지에서 사용자로부터 패스워드와 에세이를 입력받습니다.
  2. 사용자가 업로드 버튼을 누르면 php코드는 id를 랜덤으로 생성하고 시간정보인 ti를 생성합니다. 이 때, 랜덤으로 생성된 id값이 데이터베이스에 이미 존재한다면 다른 id값과 중복되지 않도록 새로 생성하길 반복합니다.
  3. 입력받은 패스워드 길이가 6자 이상인지 검사합니다. 아닐경우 업로드를 하지 않습니다.
  4. 패스워드와 시간정보를 합친 문자열을 SHA512 알고리즘으로 해싱합니다. 이렇게 해싱한 값이 평문인 essay를 AES 방식으로 암호화 할 키 값 입니다.
    password 자체를 해싱하지 않고 시간정보와 함께 해싱한 이유는, 패스워드를 알더라도 이 패스워드의 해시값만을 이용해 AES 복호화 할 가능성이 거의 없게 만들고 싶었기 때문입니다. 그래서 데이터베이스에 저장되는 모든 k값 중에 서로 같은 값은 없게 됩니다.
복호화

복호화 되는 과정 입니다:

  1. 사용자로부터 id와 패스워드를 입력받습니다.
  2. id값을 이용해 데이터베이스 Encs테이블에서 해당 튜플의 시간정보 ti값을 가져옵니다.
  3. ti값과 password 값을 합쳐서 essay를 해독할 AES 알고리즘의 키인 k값을 만듭니다.
  4. AES 암호문 essay를 k를 이용해 다시 평문으로 해독합니다.
삭제

삭제 과정입니다:

  1. Decrypt 페이지에서 Delete버튼을 누르면 삭제 페이지가 나옵니다. 그 페이지에서 사용자로부터 id와 password를 입력받습니다.
  2. 복호화 과정 때 했던것과 같이, id값을 이용해 해당 튜플의 시간정보 ti를 가져옵니다.
  3. ti와 password를 합친 값을 SHA512 알고리즘을 통해 해싱을 합니다. 그 값이 k 값입니다.
  4. 해당 튜플의 k값과 현재 만들어진 k값이 같다면 삭제할 게시글이 맞는 것 입니다.
  5. 사용자가 입력한 id값과 같은 튜플을 지웁니다.

5. 한계점

아무리 현재 뚫리지 않은 SHA512와 AES알고리즘을 사용해 암호화했다 하더라도, 네트워크 단에서 평문전송을 한다면 공격자는 사용자가 입력한 값을 훔쳐봄으로써 해킹을 할 수 있습니다.
위의 패킷들은 제가 메인 페이지에서 id와 password를 입력하고 Decrypt버튼을 눌렀을 때 잡은 것 입니다.

다음에 개발할 때는 네트워크를 통해 전달되는 정보 자체를 암호화하는 방법을 알아보고 개발해야겠습니다.

+ 한계점 추가 (20200327)

글을 확인하기 위해선 비밀번호와 5자리의 숫자를 쓸 수 있는데, 인증 확인 갯수에 대한 제한이 없어 자동화공격으로 뚫릴 수 있습니다.

▲top