인증 및 메시지 합 법성 검증 방안 공유
3629 단어 보안 암호 화golang인증신분 서비스 와 인증 솔 루 션
고 로 데 모 를 완성 했다.본인 은 안전 에 대해 서 는 문외한 이지 만 자신 이 느끼 는 것 은 비교적 안정 감 있 는 신분 인증 방안 이 어야 합 니 다.
큰 글 자 를 써 서 설명 하고 싶 지 않 습 니 다. 알 아 볼 수 있 는 것 은 코드 에 따라 보 세 요. 우선 프로 토 콜 가방 은 최소한 아래 의 몇 개의 필드 를 포함해 야 합 니 다.
type Proto struct {
//...
Timestamp int64 `json:"timestamp"` //
Nonce uint32 `json:"nonce"` //
Signature string `json:"signature"` //Hash_hmac("sha1",sortAsc(Token,Timestamp,Nonce))
BodyCrc string `json:"bodycrc"` //Hash_hmac("md5",body)
UserID string `json:"userid"`
Body string `json:"body"`
//...
}
그 다음 에 사용자 가 로그 인 할 때 해당 하 는 Token 을 얻 을 수 있 고 이 Token 은 서버 에서 유효기간 이 있 습 니 다.App 에서 사용자 Token 을 암호 화 된 sqlite 라 이브 러 리 에 저장 합 니 다.
App 측 이 서버 와 통신 하려 고 할 때 App 측 이 먼저 관련 매개 변 수 를 사용 할 때 해시 를 진행 합 니 다. Signature = Hash_hmac("sha1",sortAsc(Token,Timestamp,Nonce)) BodyCrc = Hash_hmac ("md5", body) 다음 에 서버 에 전달 합 니 다. 프로 토 콜 패키지 에 사용자 의 Token 을 다시 전달 하지 않 아 도 됩 니 다.
사용자 의 Token 은 hash 문자열 의 매개 변수 일 뿐 입 니 다.
서버 에서 받 은 후에 매개 변수 에 따라 일련의 검증 을 할 수 있 습 니 다. 신분 부분 에 대해 다음 과 같은 검 사 를 할 수 있 습 니 다.
///////////////////////////////////
//
///////////////////////////////////
u, err := UserDB.Get(msg.UserID)
if err != nil {
s.Stop()
log.Println("[IOLoop] [UserDB.Get] , .")
return
}
if UserDB.IsBlacklistsUser(msg.UserID) {
s.Stop()
log.Println("[IOLoop] [IsBlacklistsUser] , .")
return
}
// Signature = Hash_hmac("sha1",sortAsc(Token,Timestamp,Nonce)))
// token
//
if token, ret := u.CheckSignature(msg.Timestamp, msg.Nonce); ret {
if !u.IsTokenExpire(token) {
s.Stop()
log.Println("[IOLoop] [IsTokenExpire] Token, .")
return
}
} else {
s.Stop()
log.Println("[IOLoop] [CheckSignature] , , .")
return
}
그 중에서 Signature 에 관 한 부분 은 서비스 측 이 똑 같이 Timestamp + Nonce 에 따라 관련 라 이브 러 리 에서 찾 아 낸 사용자 Token 이 같은 알고리즘 으로 Hash 를 비교 합 니 다.
그 값 이 같 습 니까?
이 부분 은 주로 메시지 패키지 의 합 법성 을 검증 하거나 사용자 token 과 함께 사용자 의 aes 키 를 생 성 한 다음 aes 로 암호 화 한 후 서버 에서 메시지 내용 을 복호화 할 수 있 습 니 다.
///////////////////////////////////
//
///////////////////////////////////
// BodyCrc ,
if s.CheckBody(msg.BodyCrc, msg.Body) == false {
s.Stop()
log.Println("[IOLoop] [CheckBody] , , .")
return
}
//
if s.IsReplayAttack(msg.Timestamp, msg.BodyCrc) {
s.Stop()
log.Println("[IOLoop] [IsReplayAttack] , .")
return
}
///////////////////////////////////
더 있 으 면 안 돼.
관련 구조 체:
type MemStore struct {
users map[string]User
mtlock sync.RWMutex
//...
}
type Session struct {
//...
UserID string
MsgLastTimestamp int64 // Timestamp
MsgLastBodyCrc string // BodyCrc
//...
}
type User struct {
ID string
Token string
CreatedAt time.Time //Token
ExpiresAt time.Time //Token
//...
}
이 방안 은 나 는 그래도 간단 하고 실행 가능 하 다 고 생각한다.그러나 관계 자 는 감기 에 잘 걸 리 지 않 는 다 며 안전 하지 않다 고 판단 했다.
좋아, 이 방면 은 잘 모 르 겠 지만, 어쨌든 나 에 게 약간의 공 을 들 였 다.기억 해라, 그렇지 않 으 면 시간 이 지나 면 기억 하지 못 할 것 이다.어차피 쓰 는 것 도 다 썩 은 거리 물건 이 야.
채용 되 지도 않 았 으 니 아무 상관 이 없 을 것 이다.
BLOG: http://blog.csdn.net/xcl168
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 보안 암호 화:Https 프로 그래 밍 상세 설명이상 에서 모든 내용 을 배 웠 고 대칭 암호 화,비대 칭 암호 화,메시지 요약,디지털 서명 등 지식 은 디지털 인증서 의 작업 원 리 를 이해 하기 위해 예비 지식 으로 삼 았 다.디지털 인증 서 는 암호학 에서 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.