이전에 면접 질문리스트에 올렸던 질문들 중, 암호화에 대한 개인적 답변 정리를 간략히 가져왔다.
암호화는 어떤 식으로?
단방향 암호화로 bcrypt(비크립트)를 사용했습니다. 이때 hash와 salt 방식을 동시에 사용했습니다.
왜 두 가지를 사용했는지?
해시만 사용했을 때는 인식가능성과 속도면에서 문제가 발생합니다. 해시의 다이제스트를 해킹당하게 되면 모든 비밀번호가 노출될 가능성이 있기 때문에 인식가능성에 문제가 있고, 해시의 빠른 속도 때문에 공격자들은 매우 빠른 속도로 임의의 다이제스트와 해킹할 다이제스트를 비교할 수 있기 때문입니다.
일단 실제 면접에서는 암호화 관련 질문은 받지 못했으나, 개인적으로 정리해보면서 유익했었기 때문에 이번 주제는 암호화에 대해 간단히 말해보고자 한다. 단방향 암호화와 양방향 암호화. 그리고 주로 Hash / Salt 방식의 장단점에 대해 정리해본다!
단방향 암호화와 양방향 암호화의 차이점
원본 메시지를 알면 암호화 메시지를 알 수 있지만, 암호화 메시지로는 원본 메시지를 구할 수 없는 것(복호화 불가)이 단방향 암호화
암호화 메시지로도 원본 메시지를 구할 수 있는 것(복호화 가능)이 양방향 암호화이다.
단방향 암호화로는 대표적으로 hash 암호화를 사용하며, hash 기법 중 유명한 방식으로는 sha-256가 있다.
양방향 암호화로는 대칭키(비공개키)와 비대칭키(공개키) 암호화가 있다.
Q. 단방향 암호화는 주로 어디에 사용되나요?
자주 사용되는 것은 사용자의 비밀번호password를 저장할 때라고 한다.
단방향으로 사용자에게 입력받은 원본 메시지를 암호화한 암호화 메시지만을 저장하기 때문에 비교 시에도 암호화 메시지만 비교하면 되고, 암호화 메시지가 노출되더라도 복호화가 불가능하기 때문에 안전할 수 있다한다.
양방향 암호화의 대칭키와 비대칭키 방식
대칭키 방식 : 암호화와 복호화에 사용되는 키가 동일하다. 따라서 키를 비공개하는 방식이다. (EX. DES, AES)
비대칭키 방식 : 암호화와 복호화에 사용되는 키가 상이하다. 하나의 키를 공개하는 방식을 취한다. (EX. RSA)
대칭키는 속도가 빠르다는 장점이 있지만, 키를 배송하는 도중 키가 노출될 우려(보안에 대한 우려)가 있다.
비대칭키는 대칭키에 비해 속도가 느리다는 단점이 있지만, 키를 배송하는 도중 키가 노출될 우려를 사전에 차단한다.
단방향 해시 알고리즘
해싱은 수학적 연산을 통해서 원본 메시지를 변환하여 암호화 메시지인 다이제스트를 만드는 것이다.
단방향 데이터를 안전하게 저장하고, 무결성을 보장하는데 사용한다.
MD5, SHA1, SHA256, SHA384, SHA512와 같은 종류가 있다.
숫자가 클수록 Hash 값이 복잡한 것을 의미하기 때문에 더 안전한 암호화 방법이다.
사용자의 패스워드가 "hunter2"라면 해시 알고리즘인 SHA-256으로 인코딩하여 아래와 같은 값을 얻을 수 있다.
f52fbd32b2b3b86ff88ef6c490628285f482af15ddcb29541f94bcf526a3f6c7
대부분의 해시 함수는 입력 값의 일부가 변경되었을 때 다이제스트가 완전히 달라지도록 설계되어 있다
"hunter3"라는 값의 SHA-256 다이제스트는 아래와 같으며 위의 "hunter2"와는 완전히 달라진 것을 확인할 수 있다.
fb8c2e2b85ca81eb4350199faddd983cb26af3064614e737ea9f479621cfa57a
해당 효과를 *avalanche 효과라고 한다.
*avalanche 효과 : 쇄도 효과라고 하며, 어떤 암호 알고리즘이 입력값에 미세한 변화를 줄 경우 출력값에 상당한 변화가 일어나는 성질을 의미한다.
단방향 함수의 문제점
인식가능성(recognizability)
동일한 메시지가 언제나 동일한 다이제스트를 갖는다면, 공격자가 전처리(pre-computing)된 다이제스트를 가능한 한 많이 확보한 다음 이를 탈취한 다이제스트와 비교해 원본 메시지를 찾아내거나 동일한 효과의 메시지를 찾을 수 있다. 이와 같은 다이제스트 목록을 **레인보우 테이블(rainbow table)이라 하고, 이와 같은 공격 방식을 레인보우 공격(rainbow attack)이라 한다. 게다가 다른 사용자의 패스워드가 같으면 다이제스트도 같으므로 한꺼번에 모두 정보가 탈취될 수 있다.
속도(Speed)
해시 함수는 암호학에서 널리 사용되지만 원래 패스워드를 저장하기 위해서 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위해 설계된 것이다. 바로 여기에서 문제가 발생한다. 해시 함수의 빠른 처리 속도로 인해 공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교할 수 있다(MD5를 사용한 경우 일반적인 장비를 이용하여 1초당 56억 개의 다이제스트를 대입할 수 있다).
** 레인보우 테이블 : 가능한 hash와 원본 값을 모두 저장해 놓은 테이블이다. 암호화된 다이제스트를 테이블 내에서 검색하여 정보를 탈취할 수 있다.
해시함수를 보완하기 위한 솔팅 알고리즘
같은 암호를 같은 해시 알고리즘을 사용하게 된다면 완전히 동일한 다이제스트가 저장되게 된다.
이것은 보안에 위험을 줄 수 있고, 이 문제를 해결하기 위해 사용자마다 랜덤한 값을 암호에 덧붙여서(salt를 뿌려서) 해시 알고리즘을 사용하는 것이 솔팅 알고리즘이다.
솔트(salt)는 단방향 해시 함수에서 다이제스트를 생성할 때 추가되는 바이트 단위의 임의의 문자열이다.
결과적으로 솔팅 알고리즘을 사용하게 되면 동일한 암호더라도 다른 다이제스트를 만들 수 있게 된다.
이 방법을 사용할 때에는 모든 패스워드가 고유의 솔트를 갖고 솔트의 길이는 32바이트 이상이어야 솔트와 다이제스트를 추측하기 어렵다.
참고 자료
'IT > Interview' 카테고리의 다른 글
20.10.02 면접 스터디 (0) | 2020.10.04 |
---|---|
20.09.28 면접 스터디 (0) | 2020.09.28 |
정렬 알고리즘 (0) | 2020.08.31 |
개발 직군 기술 면접 질문 리스트 (0) | 2020.08.22 |
기술면접 참고 자료 (0) | 2020.06.20 |
댓글