저는 RESTful API 프로젝트에서 인증 방법을 가지고 놀고 있으며 인증 방법으로 HMAC-SHA256 서명을 생성하는 아이디어가 정말 마음에 듭니다.
클라이언트는 몇 가지 간단한 단계로 서명을 생성합니다.
# example client-side code
sig = hmac.new(bytes('SUPER_SECRET_KEY', 'utf-8'), b'', sha256)
sig.update(request_path)
sig.update(request_body)
# ...other variables needed for generating the signature...
signature = sig.hexdigest()
그의 "사용자 이름"(예 :)과 함께 요청 헤더에 추가합니다 Authorization: THE_USER_NAME:abcd1234xyz890
.
서버 측에서도 같은 방식으로 다시 만들려고합니다.
# example server-side code
def do_check(request):
# get user name from request header
username = request.headers['Authorization'].split(':')[0]
# some method to retrieve the "secret key" from database
user = db.User().filter(username=username).one()
# use user's "secret key" to generate the signature
sig = hmac.new(bytes(user.key, 'utf8'), b'', sha256)
sig.update(bytes(request.path, 'utf-8'))
sig.update(request.data)
# ...other variables needed for generating the signature...
return sig.hexdigest()
# compare the returned signature with the one client sent us...
이 모든 것은 사용자의 키를 데이터베이스에 일반 텍스트 로 저장하는 한 잘 작동 합니다.
| username | key |
------------------------------------
| THE_USER_NAME | SUPER_SECRET_KEY |
우리 모두는 이것이 절대적으로 용납되지 않는다는 것을 알고 있으므로 단순히 SUPER_SECRET_KEY
with 해시하고 bcrypt
대신 해시 된 문자열을 저장 하려고했습니다 .
| username | key |
--------------------------------------------------------------------------------
| THE_USER_NAME | $2b$12$UOIKEBFBedbcYFhbXBclJOZIEgSGaFmeZYhQtaE4l6WobFW1qvIf6 |
내가 지금 직면하고있는 문제는 클라이언트가 "비밀 키"의 해시되지 않은 버전을 사용하여 더 이상 일반 텍스트로되어 있지 않기 때문에 서버 측에서 할 수없는 서명을 생성했다는 것입니다.
유사한 접근 방식의 예 중 하나는 Amazon Web Services에서 HMAC 서명을 생성하는 것입니다 (동일한 프로세스에 대한 간단한 설명 도 있음 ). 추가 로그인이나 인증이 필요하지 않으며 키에 대한 토큰이나 "교체"를 제공하지 않습니다. 비밀 조합. AWS가 데이터베이스 (?)의 일반 텍스트로 비밀을 저장하고 있는지 정말 의심됩니다.
클라이언트 측이 서명 생성 방법을 변경하도록 강요하지 않고 (예 : bcrypt
비밀을 설치 하거나 해싱 하지 않도록) 데이터베이스에서 해시 된 버전의 "비밀 키"를 사용하여 서버 측에서 HMAC 서명을 어떻게 다시 만들 수 있습니까?
암호 해싱은 공유 암호를 사용하지 않습니다. 비밀을 해싱하는 행위는 암호를 인증하는 능력을 유지하면서 실제 값을 파괴하는 것입니다. 해시에서 암호를 복구 할 것이라고 합리적으로 기대할 수 없습니다.
Hmac 인증 및 유효성 검사는 공유 비밀을 사용합니다. 양측 모두이 비밀을 알아야합니다.
이러한 이유로 암호 해싱은 hmac과 근본적으로 다르며 단순히 hmac 키를 해시 할 수 없습니다. 해시는 실제 키로 돌아가는 것을 허용하지 않습니다.
[설명 후 관련없는 부분 삭제]
따라서 어딘가에 일종의 비밀이 있어야하지만 데이터베이스에있을 필요는 없습니다. 실제 hmac 공유 비밀은 대칭 암호를 사용하여 데이터베이스에서 암호화 할 수 있습니다 (데이터베이스에없는 다른 키 사용). 따라서 서버는 암호화 된 hmac 비밀 키를 읽고 암호를 해독하여 사용합니다.
중요한 것은 암호를 해독 할 수있는 방식으로 암호화해야하며 해싱을 배제해야한다는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다