해시 함수들 속도 || 그 외 암호시스템
계기
jwt 토큰 발급시 유저들마다 secret 키를 다르게 해주기위해
secret 키와 user의 pk 를 암호화해서 secret 키를 포함하여 토큰을 발급해주었다.
이 상황에서 해시 함수를 어떤걸 써야될지 고민이되었다.
암호시스템
1. HMAC [Hash-based Message Authentication Code ]
해싱에 대해서 다시 얘기해볼 때 입력값이 같다면 해싱된 해시값은 항상 동일하기 때문에 수정에 대한 검출은 가능하지만 거짓 행세하는 것을 검출하기는 어렵다.
거짓행세에 대해 검출하고 차단하기위해 SHA256으로 해싱된 메세지를 메세지 인증 코드(private key <- 추측임..)로 암호화(서명) 하여 송신하고 수신측에서는 동일하게 소유한 private key로 복호화 및 서명을 검증하는 방식이다. 동일하게 소유했다는것은 즉, HMAC SHA256 알고리즘이 대칭키 방식임을 알 수 있다.
secret 키에 액세스할 수 없는 사람의 조작으로부터 보호하는 데 사용된다.
일반적으로 이것은 secret 키가 서버에만 알려진 경우 클라이언트에 의한 조작으로부터 보호하거나 비밀이 클라이언트와 서버에 알려진 경우 전송 중 조작으로부터 보호하는 것을 의미합니다.
ex): jwt
2.RSA [ Rivest-Shamir-Adleman ]
공개키를 이용하는 대표적인 암호화방식인 RSA
메세지를 SHA256 알고리즘으로 해싱 한뒤 private key로 암호화(서명)한다. public key를 발급받은 어떠한 주체는 앞서 암호화(서명)된 해싱값을 복호화 또는 서명을 검증하는 할수 있는 방식이다.
public key는 이름 그대로 보안을 유지할 필요가 없기 때문에 ID 공급자는 이 public key를 메타 데이터 URL을 통해 쉽게 구할 수 있도록 제공한다.
RSA 기반 서명은 조작을 방지하고 다른 사람이 데이터를 조작하지 않고도 데이터의 무결성과 소스를 확인할 수 있도록 하는 데 사용된다. 이는 개인 키는 데이터 제공자와 서명자만 알고 있는 반면 공개 키는 무결성을 확인하려는 모든 사람에게 알려져 있기 때문에 가능합니다.
따라서
서버가 클라이언트의 조작으로부터 토큰을 보호해야 하는 경우 서버 측 비밀과 함께 HMAC를 사용하는 것으로 충분하다.
대신 토큰이 특정(신뢰할 수 있는) 서버에서 생성되었음을 다른 사람에게 입증해야 하는 경우 RSA 기반 서명을 사용해야 합니다.
해시 함수
MD5, SHA-1, SHA-2, SHA-3 및 BLAKE2 , BLAKE3
여기서 BLAKE3 에 대해서 알아보겠다.
BLAKE3
MD5 및 SHA-1과 달리 더 안전합니다. SHA-2와 달리 길이 확장에 대해 안전하다.
내부에 Merkle 트리가 있고 x86-64 및 더 작은 아키텍처에서도 빠른 변형이 없는 알고리즘이 있기 때문에 여러 스레드와 SIMD 레인에 걸쳐 고도로 병렬화를 할수 있다.
Merkle tree 는 쉽게 말해 이진트리를 말한다.
SIMD(Single Instruction Multiple Data) 는 하나의 명령어로 다량의 데이터를 처리하는것을 말하며 벡터 연산이라고도한다. (병렬)
BLAKE3와 BLAKE2의 주요 차이점
- 이진 트리 구조를 사용하여 해시 계산에서 무제한 병렬 처리를 달성합니다.
- 라운드 수를 10회에서 7회로 줄였습니다.
- 세 가지 작동 모드: 해시, 키 해시(HMAC) 및 키 생성(KDF).
- 이전에 키의 매개변수 블록이 차지했던 영역을 사용하기 때문에 키를 해싱할 때 추가 오버헤드가 없습니다.
- XOF(Extensible Output Function = 확장 가능한 출력 기능 ) 형식으로 작동하는 내장 메커니즘
- 병렬화 및 위치 지정(검색).
결론
듣기로는 256 까지는 따로 머신을 둘 필요가 없다고 하였고 512 이상가면 머신 을 따로 둘 필요가 있다고 하였다.
현재 256을 쓰고있긴한데 nodejs 쓰고있기때문에 서버 연산이 무거워지면 안되기때문에 해싱함수에 대해서 알아보고있었다.
그 결과 분석결과 병렬처리 가능한 blake3를 한번 써보기로 하였다.! 그리고 속도가 어마무시한것같다...
끝!