API 키와 암호를 사용하는 이유는 무엇입니까?


93

사용자에게 API 비밀을 모두 제공하는 많은 API를 발견했습니다 . 그러나 내 질문은 : 둘의 차이점은 무엇입니까?

내 눈에는 하나의 열쇠로 충분할 수 있습니다. 내가 키를 가지고 있고 나와 서버 만 알고 있다고 가정 해 보겠습니다. 이 키로 HMAC 해시를 만들고 API 호출을 수행합니다. 서버에서 HMAC 해시를 다시 생성하고 전송 된 해시와 비교합니다. 동일하면 호출이 인증됩니다.

그렇다면 왜 두 개의 키를 사용합니까?

편집 : 또는 API 비밀을 조회하는 데 사용되는 API 키입니까?


답변:


46

비밀 키 암호화는 동일한 키를 사용하여 메시지를 인코딩 한 다음 나중에 디코딩합니다. 따라서 "비밀"을 아는 사람 만 메시지를 읽을 수 있습니다.

RSA 보안은 2 개의 일치하는 키를 기반으로합니다. 각 사용자에 대한 공개 키가 있으며 모든 사람이이를 알고 있어야합니다. 사용자 만 알아야하는 개인 키도 있습니다. 공개 키로 암호화 된 메시지는 개인 키로 만 해독 할 수 있으며 그 반대의 경우도 마찬가지입니다.

따라서 내가 읽을 수있는 메시지를 보내려면 네트워크에서 공개 키를 가져 와서 해당 키로 메시지를 암호화하면 암호를 해독 할 수있는 유일한 사람입니다.

또는 내가 메시지를 보냈다는 것을 증명하고 싶다면 내 개인 키로 메시지를 암호화하고 (공개 텍스트 또는 다른 메시지로) 암호화 방법을 알려줄 수 있습니다. 그런 다음 내 공개 키로 메시지를 해독 할 수 있으며 읽을 수있게되면 내가 보낸 메시지임을 알 수 있습니다.

이 암호화 형식은 상당히 컴퓨터 집약적이므로 RSA 기술을 사용하여 일회성 "비밀 키"를 암호화 한 다음 비밀 키로 나머지 메시지를 암호화 한 다음 두 번째 방식으로 내 서명을 암호화하는 경우가 있습니다. 그런 다음이 프로세스를 되돌려 메시지와 서명을 읽을 수있는 경우 귀하와 귀하 만 읽을 수 있으며 내가 메시지를 보냈 음을 확인합니다.

또는

자세한 설명은이 링크를 참조하십시오.

API 키와 비밀 키는 어떻게 작동합니까?


9
좋은 대답이지만 Facebook 또는 Gmail 등에서 API 비밀 및 키를 사용할 때 어떤 시점에서도 암호화하거나 해시 할 필요가 없습니다. 이 경우 API 비밀 및 키의 요점은 무엇입니까?
Quintonn

2
Facebook을 예로 들면 app_secret을 사용하는 두 가지 시나리오가 있습니다. 첫 번째는 해싱이 필요하지 않습니다. 주로 리디렉션 URL이 도용되는 것을 방지하는 데 사용됩니다. 사용자가 로그인하고 facebook이 리디렉션 URL에 액세스 토큰을 직접 보낸 경우 앱 액세스 권한을 부여한 후에는 액세스 토큰이 Facebook에서 온 것인지 확인할 방법이 없습니다. 내 자신의 액세스 토큰을 리디렉션 URL에 게시하고 API에서 오는 facebook 작업을 실행할 수 있습니다. 대신 facebook은 리디렉션 URL에 코드를 보냅니다. 그런 다음 api는 코드를 실제 액세스 토큰으로 교환합니다.
라이언 토마스

2
후반부에서 실제 액세스 토큰에 대한 코드를 교환하는 동안 facebook은 사용자의 API가 서명으로 ID를 확인할 것으로 예상합니다. 이 시나리오에서는 서명을 위해 공개 키 암호화가 필요하지 않으며 단순히 앱의 비밀을 유지하고 서명으로 사용하기 위해 사용자를 신뢰합니다. 이것은 서명을 생성하기 위해 단방향 함수를 사용하지 않고 항상 어리석은 것처럼 보였지만 앱 비밀을 직접 사용하기위한 성능과 같은 이유가 있다고 생각합니다.
라이언 토마스

두 번째 사용 사례에서는 암호화 해싱을 사용합니다. 실제 access_token을 가지고 페이스 북과 상호 작용을 시작한 후에는 앱이 도용되지 않도록 추가 보안을 원할 수 있습니다. Facebook 앱 콘솔에서 앱의 모든 Facebook API 요청에 액세스 토큰과 함께 서명을 포함해야하는 기능을 켤 수 있습니다. 나는 그들의 동기를 추측하고 있지만이 시점에서 그들은 모든 요청에 ​​대해 서명으로 app_secret을 반복적으로 보내는 것을 원하지 않는다고 생각합니다. 더 많이 보낼수록 app_secret이 손상 될 가능성이 커집니다.
라이언 토마스

1
이 추가 보안 기능을 선택했기 때문에 Facebook이 암호화 해시 호출을 사용하여 서명을 확인하는 추가 성능 오버 헤드를 허용하도록 일종의 결정을 내린 것 같습니다. 어쨌든이 시나리오에서는 Facebook API 요청과 함께 두 개의 값을 전달합니다. 서명 역할을하는 access_token 및 appsecret_proof라는 값. 앱 비밀 증명은 app_secret을 키로 사용하는 access_token의 암호화 해싱에 의해 생성됩니다.
라이언 토마스

55

두 개의 개별 키가 필요합니다. 하나는 귀하가 누구인지 알려주는 키이고 다른 하나는 귀하가 말하는 사람임을 증명하는 키 입니다.

"키"는 사용자 ID이고 "비밀"은 비밀번호입니다. 그들은 "키"와 "비밀"용어를 사용합니다. 그것이 그들이 그것을 구현 한 방법이기 때문입니다.


1
그리고 만약 당신이 https를 통해 통신한다면? 그렇다면 비밀 키로 메시지를 암호화하는 이유는 무엇입니까?
kamuniaft

6
요점은 항상 위험을 줄이는 것입니다. https 통신이 손상되면 요청을 읽을 수있는 공격자가 새 요청을 위조 할 수 없습니다. 귀하의 API가 고양이 사진의 순위를 매기려고한다면 별거 아닙니다. 결제 API라면 여러 계층의 보안을
갖추는

두 개의 개별 키가 목적이라고 생각합니다. 단일 클라이언트 앱의 다른 사용자가 서로 다른 비밀을 가질 수 있기 때문입니다. 그렇지 않으면 모두 같은 비밀을 가지면 키를 갖는 것이 유용하지 않습니다. 권리?
Honey

이 API가 Bearer:인증을 사용하지 않는 이유는 무엇 입니까? 거기에 ID와 암호가 있습니다.
Stefan Haberl

7

간단한 대답, 내가 올바르게 이해했다면 ...

암호화를 위해 API 키를 사용하는 경우 서비스는 누구에게 연락하는지 어떻게 알 수 있습니까? 그들은 그 메시지를 어떻게 해독할까요?

API 키를 사용하여 자신이 누구인지, 이것이 일반 텍스트로 보내는 것입니다. 누구에게도 보내지 않는 SECRET 키 . 암호화에 사용하면됩니다. 그런 다음 암호화 된 메시지를 보냅니다. 암호화에 사용 된 키를 보내지 않으면 목적이 무효화됩니다.


그렇습니다. API 키를 서버로 보냅니다. 따라서 이것은 서버와의 통신을 가로 챌 수있는 모든 사람에게 그 가치를 제공하고 있음을 의미합니다.
ancajic

내가 본 거의 모든 API는 키와 비밀을 모두 서버로 보냅니다. 서버에 대한 연결은 이론적으로 동일한 수준의 보안으로 암호화됩니다. 그러나 나는 서버 외에는 누구에게도주지 않는다.
sudo

secret일반 텍스트로 보내는 것을 본 적이 없습니다 . 링크를 주시겠습니까? 내가 본 것은 secret일부 데이터를 암호화하는 데 사용 하는 것입니다. 그리고 암호화 된 데이터와 함께 apiKey서버가 데이터를 해독하는 방법을 알 수 있도록 전송 합니다.
ancajic

twilio.com/docs/sms/tutorials/…nexmo.github.io/Quickstarts/sms/send 는 StackOverflow에서 검색하도록 유도 한 예입니다.
sudo

Twilio는 이러한 용어를 정확히 사용하지 않습니다. 그러나 Nexmo 확실히 그들은 단지 데이터를 요구하고있다처럼 순간적 후, 그것은 것입니다 ...하지만 secret하고 apiKey그리고 그들이 실제로 일을하다을 username하고 password. 어떤 완전히 다른 것입니다 ...
ancajic

3

비밀 및 (공개) 키가 무엇인지 설명하는 답변이 있습니다. 혼란스러운 이름을 부여하는 공개-개인 키 쌍입니다. 그러나 API에 두 가지 모두가 필요한 이유는 아무도 말하지 않으며 많은 API는 하나의 비밀 만 제공합니다! 나는 또한 API 문서가 왜 두 개의 키가 있는지 설명하는 것을 본 적이 없으므로 내가 할 수있는 최선은 추측하는 것입니다 ...

요청에 공개 키만 입력하고 개인 키를 사용하여 로컬로 요청에 서명하는 것이 가장 좋습니다. 더 많은 것을 보낼 필요가 없습니다. 그러나 일부는 요청에 비밀을 가지고 도망칩니다. 좋아, 좋은 API는 TLS (일반적으로 HTTPS를 통해)와 같은 전송 보안을 사용합니다. 그러나 여전히 개인 키를 그런 방식으로 서버에 노출하고있어 어떻게 든 잘못 처리 할 위험이 증가합니다 (참조 : 최근에 발견 된 GitHub 및 Twitter의 암호 로깅 버그). 그리고 HTTPS는 이론적으로는 안전하지만 항상 구현상의 결함이 있습니다.

하지만 실제로 대부분의 경우 API는 사람들이 자신의 서명을하는 것보다 쉽기 때문에 요청에 두 키를 모두 보냅니다. 그렇지 않으면 순수한 cURL 예제를 가질 수 없습니다! 이 경우 분리하는 것은 의미가 없습니다. 별도의 키는 나중에 API를 변경하여 활용하는 경우를 대비 한 것 같습니다. 또는 일부는 더 안전한 방법으로 수행 할 수있는 클라이언트 라이브러리를 가지고 있습니다.


1

그것은, 마커스 아담스의 대답의 확장하지만 내가 여기에 언급을 참조하지 않았다고 한 것은 당신의 가능성이있는 경우를 식별하고 사용자를 인증 모두에 단일 정보를 사용하지해야한다는 것입니다 타이밍 공격 ,하는 수 응답 시간의 차이를 사용하여 문자열 비교가 얼마나 멀리되었는지 추측하십시오.

"키"를 사용하여 사용자 또는 자격 증명을 조회하는 시스템을 사용하는 경우 수천 개의 요청을 보내고 데이터베이스가 찾는 데 걸리는 시간을 검사하여 시간이 지남에 따라 해당 정보를 점진적으로 추측 할 수 있습니다. 찾기) 기록. "키"가 키의 단방향 해시 대신 일반 텍스트로 저장되는 경우 특히 그렇습니다. 사용자에게 키를 다시 표시 할 수 있어야하는 경우 사용자의 키를 일반 텍스트로 저장하거나 대칭 적으로 암호화 할 수 있습니다.

두 번째 정보 또는 "비밀"이 있으면 먼저 타이밍 공격에 취약 할 수있는 "키"를 사용하여 사용자 또는 자격 증명을 조회 한 다음 타이밍 안전 비교 기능을 사용하여 값을 확인할 수 있습니다. 비밀".

다음은 해당 함수의 Python 구현입니다.

https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727

그리고 그것은 hmaclib (그리고 아마도 다른 것)에 노출됩니다 .

https://docs.python.org/3/library/hmac.html#hmac.compare_digest


여기서 주목해야 할 점은 비교되는 값이 입력 문자열의 문자가 변경 될 때마다 무작위로 변경되기 때문에 이러한 종류의 공격이 조회 전에 해시되거나 암호화 된 값에 대해 작동하지 않는다는 것입니다. 여기에 대한 좋은 설명을 찾았 습니다 .

API 키를 저장하는 솔루션은 다음과 같습니다.

  1. 별도의 키와 비밀을 사용하고, 키를 사용하여 레코드를 조회하고, 타이밍 안전 비교를 사용하여 비밀을 확인합니다. 이를 통해 사용자에게 키와 비밀을 다시 표시 할 수 있습니다.
  2. 별도의 키와 비밀을 사용하고, 비밀에 대해 대칭적이고 결정론적인 암호화를 사용하고, 암호화 된 비밀의 정상적인 비교를 수행합니다. 이를 통해 사용자에게 키와 시크릿을 다시 표시 할 수 있으며 타이밍에 안전한 비교를 구현하지 않아도됩니다.
  3. 별도의 키와 비밀을 사용하고 비밀을 표시하고 해시하고 저장 한 다음 해시 된 비밀의 일반적인 비교를 수행합니다. 이렇게하면 양방향 암호화를 사용할 필요가 없으며 시스템이 손상 될 경우 보안을 유지하는 추가 이점이 있습니다. 사용자에게 다시 비밀을 보여줄 수 없다는 단점이 있습니다.
  4. 단일 키를 사용 하여 사용자에게 한 번 보여주고 해시 한 다음 해시되거나 암호화 된 키의 일반적인 조회를 수행합니다. 단일 키를 사용하지만 사용자에게 다시 표시 할 수 없습니다. 시스템이 손상된 경우 키를 안전하게 유지하는 이점이 있습니다.
  5. 단일 키를 사용 하여 사용자에게 한 번 보여주고 암호화 한 다음 암호화 된 비밀을 정상적으로 조회합니다. 사용자에게 다시 표시 될 수 있지만 시스템이 손상되면 키가 취약 해집니다.

이 중 3이 보안과 편리함의 가장 좋은 균형이라고 생각합니다. 키를 발급받을 때 많은 웹 사이트에서 구현되는 것을 보았습니다.

또한 실제 보안 전문가를 초청하여이 답변을 비판합니다. 나는 이것을 또 다른 논의 포인트로 사용하고 싶었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.