1. mysqlpassword() 함수 암호화 방식

mysql에서 비밀번호와 같은 데이터들을 암호화 해주는 함수를 제공합니다.

그래서 우리는 사용자로부터 입력 받은 데이터들을 password() 함수의 인자로 전달하기만 하면, 개발자도 모르는 암호화된 값이 DB에 저장됩니다.



password() 함수SHA-1 알고리즘을 두 번 거쳐서 앞에 *를 붙이는 방식으로 계산됩니다.  ( 참고 링크 )





2. SHA-1이란?

SHA-1은 단방향 암호화 함수로서 "RFC-3174로 묘사된 문자에 대한 160 비트 checksum을 계산하여 40 헥사 자리 바이너리 문자열을 반환하는 것"을 말합니다.

무슨 소린지 저도 모르겠고... 간단하게 말하면 해싱 알고리즘으로써 어떤 문자열 값을 일정 길이의 문자열로 변환하는 것을 말합니다.

압축과 같은 것이죠.


SHA-1는 해싱된 결과 값의 길이가 짧기 때문에 무작위 공격으로 인해 쉽게 뚫릴 수 있다는 단점이 있습니다.

즉, CPU 연산력이 날이 갈수록 좋아지기 때문에 길이를 늘리는 방법으로 대응해오고 있습니다.

그래서 SHA-1보다 SHA-256 , SHA-512 등을 사용하도록 권장하고 있습니다.

SHA-2는 SHA-1보다 길이가 길기 때문에 원래 값을 찾아내는데 시간이 더 오래 걸리므로 보안에 더 좋다고합니다.


아래 사진은 SHA1과 SHA256을 비교하는 글의 일부이며, 해싱된 결과 값이 다르다는 것을 보여줍니다. ( 원본 링크 )




그런데 SHA는 암호화가 아닌 사실 해시 알고리즘이기 때문에 보안상 완벽하지는 않습니다.

Rainbow Table ( 해시 함수를 사용하여 변환 가능한 모든 해시 값을 저장시켜 놓은 표 - 참고 )을 사용하면 짧은 시간으로 원래 값을 뽑아낼 수 있기 때문이죠.

그래서 SHA 방식만 사용하여 암호화를 하는 것보다 salt를 추가하는 방식이 주로 사용되고 있습니다.


salt란 SHA 알고리즘 방식에 어떤 데이터( 문자열이든 숫자든 원하는 데이터 )를 추가하여 양념을 뿌리는 것을 말합니다.

Rainbow Table로 원래 값을 확인할 수 없도록 보안성을 높이는 방식이죠.





3. 암호화 종류

1) 단방향 암호화

  • 해싱을 이용하는 암호화 기법
  • 암호화를 한 후 복호화를 할 필요가 없는 경우에 사용됨
  • 비밀번호, 주민번호를 인코딩 할 때 사용됨
    • ex) MD5, SHA 등..

      • MD5는 매우 취약하며, 최소한 SHA-256 이상 사용을 권장



2) 대칭형 암호화 ( 비밀키 암호화 )

  • 암호화와 복호화에 같은 키를 사용하여 암호화 하는 방식 ( 대칭키 )
  • 암호화를 해봤자 키가 노출되면 그냥 털리게 됨
    • ex) DES , DES3 , AES 등…



3) 비대칭형 암호화 ( 공개키 암호화 )

  • 암호화 키와 복호화 키가 다른 것
    • 송신자는 수신자의 공개키를 받아 메시지를 암호화 하고,

    • 수신자는 자신만이 갖고 있는 개인키를 이용하여 복호화 함.

    • 즉, 메시지는 누구나 암호화가 가능하지만 복호화는 비밀키를 갖는 개인만이 가능

  • 대칭형 암호화에서 발생하는 키 분배의 문제를 해결하기 위한 암호화 기법

  • 매우 큰 수의 소인수 분해가 어렵다는 것에 기반을 둠

  • 2048bit 크기의 수에 대하여 두 소인수를 구하려면 10년은 걸린다고 함(?) ( feat. 리만 가설 )

    • ex) RSA