파이널 프로젝트에 jwt와 bcrypt를 도입하다보니 양방향과 단방향 암호화라는 걸 알게되었습니다. 단방향 암호화는 단순히 데이터베이스에 보이는걸 감추기 위해서 사용했지만, 당시에 사용하기 위해서 겉으로만 하고 어떤 기술인지 구체적으로 알아보지않아 정리해보고자합니다.
사용자가 입력한 데이터를 알아볼 수 없는 데이터로 변경하는 과정을 말합니다.
반대로 복호화란 암호문을 평문으로 변화하는 과정을 말합니다.
단방향 암호화 : 암호화 후 복호화 할 수 없는 것이 특징입니다.
양방향 암호화 : 암호화 복호화 모두 가능한 것이 특징입니다.
대칭형은 암호화와 복호화에 서로 동일한 키가 사용되는 암호화 방식으로 키를 비공개하는 게 특징입니다. 속도가 빠르다는 장점이 존재하지만, 키를 전달하는 과정에서 키가 노출될 우려가 있다는 단점이 존재합니다. 대표적으로는 AES가 있습니다.
AES(Advanced Encryption Standard)
https://www.zehye.kr/etc/2021/09/15/etc_encryt/ 가시면 AES를 체험해 볼 수 있습니다.
암호화, 복호화에 서로 다른 키가 사용되는 방식으로 하나의 키는 공개키로 사용하는게 특징입니다.
대표적으로 RSA가 있습니다.
RSA(Rivest Shamir Adleman)
공개키 암호 시스템의 하나로 암호화 뿐만 아니라 전자서명이 가능한 최초의 알고리즘으로 주로 적은양의 데이터나 전자서명에 사용합니다.
프로젝트떄 주로 사용하는 jwt(json web token)은 비대칭 암호화 알고르짐을 사용하느 토큰형 인종방식입니다.
단방향 암호화는 평문을 암호화하는 것은 가능하지만 암호화된 비밀번호를 다시 평문으로 복호화하는 것은 어렵습니다. 그래서 비밀번호를 관리할 때 사용합니다.
잘 알려진 암호화로는 해시 알고리즘이 있습니다.
=> 우리가 사이트를 이용할 때, 예전에는 비밀번호를 잊어먹었을 경우에 비밀번호 찾기를 누르면 비밀번호를 알려주었지만 요즘에는 알려주지않고 새비밀번호를 적으라고 합니다. 굳이 복호화할 필요가 없기 떄문에 이렇게 하는 것입니다.
=> 그렇다면 비밀번호를 입력하면 맞다고 어떻게 확인할까?
기존에 데이터베이스에 저장된 암호화한 비밀번호와, 입력받은 비밀번호를 단방향 암호화해서 암호화한 비밀번호를 비교해서 확인합니다.
하지만 이는 '레인보우 공격'에 취약합니다.
레인보우(rainbow attack)
항상 동일한 값을 갖는다면 탈취한 값을 기반으로 rainbow table을 만들어 이를 기반으로 공격
=> 같은 비밀번호를 입력했을 경우에, 단방향은 똑같은 암호화된 비밀번호가 나올 수 있습니다. 그렇다면 비밀번호가 누출될 수 있기 떄문에 'salt'를 사용해 이를 해결할 수 있습니다.
말그대로 소금을 뿌려서 해커가 복호화하는 것을 막는 방법입니다. 이는 암호화할 때 소금을 뿌려 입력으로 들어가는 비밀번호에 추가 문자열을 덧붙여, 비밀번호를 같이 입력한다고해도 같은 해쉬 출력 값을 가지지 못하도록 합니다.
그럼에도 불구하고...해킹을 할려고합니다. 바로 '무차별 대입공격'을 통해서 비밀번호를 알아낼려고합니다.
무차별 대입공격(brute-force attack)
말 그대로 무차별적으로 계속 데이터를 넣어서 암호를 찾는 것입니다.
=>
키 스트래칭 방법을 이용해서 막을 수 있습니다(?), 막기보다는 지연시킵니다. 이는 hash를 반복하게 함으로, 해커가 해킹을 시도하는 시간이 늘어나게 하는 것입니다.
이번 프로젝트때 사용했던 bcrypt가 이 단방향에 해당됩니다.
찾으면서 알게되었는데 bcrypt보다 scrypt가 더 안전하다고 합니다!
https://raonctf.com/essential/study/web/cryptography
https://www.zehye.kr/etc/2021/09/15/etc_encryt/
https://velog.io/@kho5420/bcrypt-jwt-%EC%96%91%EB%B0%A9%ED%96%A5-%EC%95%94%ED%98%B8%ED%99%94-%EB%8B%A8%EB%B0%A9%ED%96%A5-%EC%95%94%ED%98%B8%ED%99%94
https://velog.io/@kho5420/bcrypt-jwt-%EC%96%91%EB%B0%A9%ED%96%A5-%EC%95%94%ED%98%B8%ED%99%94-%EB%8B%A8%EB%B0%A9%ED%96%A5-%EC%95%94%ED%98%B8%ED%99%94
https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-crypto-%EB%AA%A8%EB%93%88-%EC%95%94%ED%98%B8%ED%99%94
https://pakss328.medium.com/%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EB%8B%A8%EB%B0%A9%ED%96%A5-%EC%95%94%ED%98%B8%ED%99%94%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC-f2739a1485e