2015-02-04 3 views
3

저는 Sinatra API를 보안하려고합니다.JWT에 서명하는 방법?

나는 ruby-jwt을 사용하여 JWT를 만들었지 만, 무엇을 사인해야하는지 정확히 알지 못합니다.

나는 사용자의 BCrypt password_digest을 사용하려고하는데, password_digest이 호출 될 때마다 변경 내용을 확인하기 때문에 서명을 유효하지 않게 만듭니다.

+0

@ joelparkerhenderson 귀하의 답변에 댓글을 달았지만 답변을 얻지 못했습니다. 네, 그래도 도움이되었습니다. 나는 그것을 표시 할 것이지만 대답 해주세요. – Hugo

+0

@joelparkerhenderson 나는 답변을 투표했지만 받아 들여지지 않았습니다. – Hugo

+0

@joelparkerhenderson 방금 감사했습니다. 그것은 좋은 대답입니다. 좋은 접근 방식이 무엇인지에 관해서 온라인으로 아무것도 찾을 수 없었고 실제로는 아주 간단합니다. – Hugo

답변

3

사용자의 bcrypt 암호 다이제스트가 아닌 모든 종류의 응용 프로그램 비밀 키를 사용하십시오.

SecureRandom.hex(64) 
:

JWT_KEY=YOURSIGNINGKEYGOESHERE 

내가 개인적으로 단순 무작위 16 진수 문자열을 사용하여 키를 생성 :

예를 들어

는, 항목 등으로, 도트 ENV 보석과 .env의 파일을 사용

16 진수 문자열에는 0-9와 af 만 포함되므로 문자열은 URL에서 안전합니다.

+0

그래,하지만 실제 키를 생성하려면 어떻게해야합니까? 나는 Base64.encode64 (SecureRandom.random_bytes (128))와 같은 것을 생각하고있다. 괜찮습니까? 그것은 더 길거나 다를 것인가? – Hugo

1

wikipedia에 따르면 암호화에 사용되는 비밀 키는 기본적으로 잠금을 열 수있는 키입니다. 열쇠는 일관성 있고 신뢰할 수 있어야하지만, 집에서 사용할 열쇠처럼 반복하기가 쉽지 않습니다.

this answer에서 설명한 것처럼 비밀 키는 무작위로 생성되어야합니다. 그러나 여전히 응용 프로그램에서 사용하기 위해 키를 보존해야합니다. bcrypt의 암호 다이제스트를 사용하면 실제로 기본 보안 키 (암호)에서 파생 된 해시 키를 사용하고 있습니다. 해시는 임의적이기 때문에 사용자가 말한대로 신뢰할 수있는 비밀 키가 아닙니다.

이전 답변 SecureRandom.hex(64)을 사용하면 초기 기본 애플리케이션 키를 생성 할 수 있습니다. 그러나 프로덕션 시스템에서는이를 구성 변수로 사용하고 응용 프로그램을 여러 번 실행하여 일관된 사용을 위해이 변수를 저장해야합니다 (예 : 서버 재부팅 후에 모든 사용자의 JWT를 무효로 만들지 않아야 함) 분산 서버. This article은 레일에 대한 환경 변수에서 비밀 키를 가져 오는 예제를 제공합니다.