해시 된 "암호"로 HMAC 서명 생성

정오표

저는 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_KEYwith 해시하고 bcrypt대신 해시 된 문자열을 저장 하려고했습니다 .

| username      | key                                                          |
--------------------------------------------------------------------------------
| THE_USER_NAME | $2b$12$UOIKEBFBedbcYFhbXBclJOZIEgSGaFmeZYhQtaE4l6WobFW1qvIf6 |

내가 지금 직면하고있는 문제는 클라이언트가 "비밀 키"의 해시되지 않은 버전을 사용하여 더 이상 일반 텍스트로되어 있지 않기 때문에 서버 측에서 할 수없는 서명을 생성했다는 것입니다.

유사한 접근 방식의 예 중 하나는 Amazon Web Services에서 HMAC 서명을 생성하는 것입니다 (동일한 프로세스에 대한 간단한 설명 도 있음 ). 추가 로그인이나 인증이 필요하지 않으며 키에 대한 토큰이나 "교체"를 제공하지 않습니다. 비밀 조합. AWS가 데이터베이스 (?)의 일반 텍스트로 비밀을 저장하고 있는지 정말 의심됩니다.

클라이언트 측이 서명 생성 방법을 변경하도록 강요하지 않고 (예 : bcrypt비밀을 설치 하거나 해싱 하지 않도록) 데이터베이스에서 해시 된 버전의 "비밀 키"를 사용하여 서버 측에서 HMAC 서명을 어떻게 다시 만들 수 있습니까?

케니 오 스트롬

암호 해싱은 공유 암호를 사용하지 않습니다. 비밀을 해싱하는 행위는 암호를 인증하는 능력을 유지하면서 실제 값을 파괴하는 것입니다. 해시에서 암호를 복구 할 것이라고 합리적으로 기대할 수 없습니다.

Hmac 인증 및 유효성 검사는 공유 비밀을 사용합니다. 양측 모두이 비밀을 알아야합니다.

이러한 이유로 암호 해싱은 hmac과 근본적으로 다르며 단순히 hmac 키를 해시 할 수 없습니다. 해시는 실제 키로 돌아가는 것을 허용하지 않습니다.

[설명 후 관련없는 부분 삭제]

따라서 어딘가에 일종의 비밀이 있어야하지만 데이터베이스에있을 필요는 없습니다. 실제 hmac 공유 비밀은 대칭 암호를 사용하여 데이터베이스에서 암호화 할 수 있습니다 (데이터베이스에없는 다른 키 사용). 따라서 서버는 암호화 된 hmac 비밀 키를 읽고 암호를 해독하여 사용합니다.

중요한 것은 암호를 해독 할 수있는 방식으로 암호화해야하며 해싱을 배제해야한다는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

asp.net에서 해시 된 암호로 로그인 생성

분류에서Dev

암호가 서버에서 생성 된 경우에도 암호 해싱?

분류에서Dev

HMAC에서 암호 해시를 비밀 키로 사용해야합니까?

분류에서Dev

암호에서 파생 된 키로 암호화 된 파일 ... 사용자가 암호를 잊어 버린 경우

분류에서Dev

Codeigniter에서 해시 된 암호로 로그인

분류에서Dev

MySQL에서 변수로 보이는 해시 된 암호 부분

분류에서Dev

node.js를 사용하여 php / mcrypt로 생성 된 AES-ECB 암호문에서 해독

분류에서Dev

PHP에서 해시 된 암호와 로그인 암호를 확인하는 방법

분류에서Dev

안드로이드 코드에서 암호를 생성하는 방법을 설명해 주시겠습니까?

분류에서Dev

암호 해시 생성

분류에서Dev

암호 해독 된 암호를 명령에 파이프

분류에서Dev

PHP 암호화를위한 HMAC 생성

분류에서Dev

C #으로 암호화 된 SQL Anywhere 16에서 AES 해독

분류에서Dev

AES 암호 해독 문제-SagePay에서 반환 된 암호

분류에서Dev

C #에서 암호화 된 암호 해독 문자열

분류에서Dev

해시 된 암호 해독

분류에서Dev

암호 해시 함수에 대한 솔트를 생성하는 데 허용 된 메서드-C ++

분류에서Dev

GnuPG로 암호화 된 파일 해독

분류에서Dev

GnuPG로 암호화 된 파일 해독

분류에서Dev

luks 암호화 된 CentOS 시스템에서 FIPS를 활성화하면 부팅 암호가 손상됨

분류에서Dev

원격 시스템에서 파일을 암호화하는 방법 및 암호화 된 파일은 로컬 시스템에 직접 저장해야합니다.

분류에서Dev

원격 시스템에서 파일을 암호화하는 방법 및 암호화 된 파일은 로컬 시스템에 직접 저장해야합니다.

분류에서Dev

Expect에서 캐시 된 암호 요청

분류에서Dev

로그인시 해시 된 암호 확인

분류에서Dev

bcrypt 해시 된 암호로 시스템 마이그레이션

분류에서Dev

기존 해시 된 암호로 Django 인증 시스템 사용

분류에서Dev

무작위로 생성 된 암호는 안전합니까?

분류에서Dev

암호로 자동 생성 된 .html 파일 보호

분류에서Dev

새로 생성 된 DM-CRYPT / LUKS 파티션에서 "이 암호로 사용할 수있는 키 없음"

Related 관련 기사

  1. 1

    asp.net에서 해시 된 암호로 로그인 생성

  2. 2

    암호가 서버에서 생성 된 경우에도 암호 해싱?

  3. 3

    HMAC에서 암호 해시를 비밀 키로 사용해야합니까?

  4. 4

    암호에서 파생 된 키로 암호화 된 파일 ... 사용자가 암호를 잊어 버린 경우

  5. 5

    Codeigniter에서 해시 된 암호로 로그인

  6. 6

    MySQL에서 변수로 보이는 해시 된 암호 부분

  7. 7

    node.js를 사용하여 php / mcrypt로 생성 된 AES-ECB 암호문에서 해독

  8. 8

    PHP에서 해시 된 암호와 로그인 암호를 확인하는 방법

  9. 9

    안드로이드 코드에서 암호를 생성하는 방법을 설명해 주시겠습니까?

  10. 10

    암호 해시 생성

  11. 11

    암호 해독 된 암호를 명령에 파이프

  12. 12

    PHP 암호화를위한 HMAC 생성

  13. 13

    C #으로 암호화 된 SQL Anywhere 16에서 AES 해독

  14. 14

    AES 암호 해독 문제-SagePay에서 반환 된 암호

  15. 15

    C #에서 암호화 된 암호 해독 문자열

  16. 16

    해시 된 암호 해독

  17. 17

    암호 해시 함수에 대한 솔트를 생성하는 데 허용 된 메서드-C ++

  18. 18

    GnuPG로 암호화 된 파일 해독

  19. 19

    GnuPG로 암호화 된 파일 해독

  20. 20

    luks 암호화 된 CentOS 시스템에서 FIPS를 활성화하면 부팅 암호가 손상됨

  21. 21

    원격 시스템에서 파일을 암호화하는 방법 및 암호화 된 파일은 로컬 시스템에 직접 저장해야합니다.

  22. 22

    원격 시스템에서 파일을 암호화하는 방법 및 암호화 된 파일은 로컬 시스템에 직접 저장해야합니다.

  23. 23

    Expect에서 캐시 된 암호 요청

  24. 24

    로그인시 해시 된 암호 확인

  25. 25

    bcrypt 해시 된 암호로 시스템 마이그레이션

  26. 26

    기존 해시 된 암호로 Django 인증 시스템 사용

  27. 27

    무작위로 생성 된 암호는 안전합니까?

  28. 28

    암호로 자동 생성 된 .html 파일 보호

  29. 29

    새로 생성 된 DM-CRYPT / LUKS 파티션에서 "이 암호로 사용할 수있는 키 없음"

뜨겁다태그

보관