Hashing

hyejin Noh·2020년 6월 17일
0

CODESTATES

목록 보기
1/3

No Authentication

만약 인증 과정을 거치지 않고 이메일과 관련된 정보들을 얻는다고 했을 때, 위의 그림처럼 설계가 된다.
but, 위의 처럼 만들었을 때 보안상의 이슈가 발생하게 된다. 누구라도 이메일을 알고 있으면 모든 부가 정보에 접근할 수 있다.

Authentication ( Plaintext )

password를 추가하여 요청했을 때 server는 DB에서 이메일과 패스워드를 받아 client에서 받은 정보와 대조하여 데이터가 맞으면 요청한 데이터를 주도록 한다. but, 이것만으로도 보안상의 이슈가 해결된 것이 아니다. 서버에는 문자 그대로의 password가 DB에 저장될 것이고 만약 해커가 DB에 접근해 password 데이터를 가져간다면 사용자가 똑같은 암호를 쓴 다른 server에서도 데이터를 훔쳐갈 수 있게 된다. 그래서 password를 암호화하여 DB 저장하는 작업이 필요하다.

Encryption

암호와는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하여 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 '알고리즘'을 이용해 정보를 전달하는 과정

Authentication ( Encryption )

client에서 받은 비밀번호를 서버측에서 암호화를 해서 DB에 저장 & 대조한다. DB에서 password가 노출되었을 때 Authentication ( Plaintext ) 때 말했던 보안상의 이슈를 해결할 수 있게 된다.

Hashing

어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것

  1. 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다.
  2. 최대한 해시 값을 피해야하며, 모든 값은 고유한 해시 값을 가진다.
  3. 아주 작은 단위의 변경 이라도 완전히 다른 해시 값을 가져야 한다.

대표적인 HASH ALGORITHM: SH1, SH256

Authentication ( Hashing )

Salt

해시 하려는 값(원본)에 추가하는 값

유저마다 Salt를 다르게 한다.

  1. 암호화를 진행했다면 '해당 알고리즘을 알고 있는 순간' 바로 원본을 얻어낼 수 있다.
  2. 원본값에 임의로 약속된 추가 문자열을 추가하여 해시를 진행하여 기존 해시값과 전혀 다른 해시 값이 반환되어 알고리즘이 노출 되더라도 원본 값을 보호할 수 있도록 하는 안전장치
  3. 기존: (암호화 하려는 값) => (hash 값)
    Salt 사용: (암호화 하려는 값) + (Salt 용 값) => (hash 값)

Authentication ( Salt + Hashing )

Crypto(NodeJS)

NodeJS 내장 암호화 모듈

Crypto API Documents

<script>
    const crypto = require('crypto');
    
    const secret = 'abcdefg'; // Salt
    const hash = crypto.createHmac('sha256', secret) // 알고리즘 방식은 무엇으로 할지
    			.update('I love cupcakes') // Hashing 할 값
                .digest('hex');	// 인코딩 방식
   
   console.log(hash);   	
  // Prints:
  //   c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e

</script>

값 + Salt => 알고리즘으로 값 변환 => 변환 값을 입력 받은 방식으로 인코딩 => Hash 값

출처: CODESTATES

0개의 댓글