인증 및 메시지 합 법성 검증 방안 공유

나 는 최근 에 서비스의 안전 을 보장 하기 위해 적당 한 데이터 암호 화 와 신분 인증 방안 을 찾 아야 한다.아무런 경험 도 없 이 악 보 를 뒤 집 은 후에 야 마침내 하나의 방안 을 통합 시 켰 다.
고 로 데 모 를 완성 했다.본인 은 안전 에 대해 서 는 문외한 이지 만 자신 이 느끼 는 것 은 비교적 안정 감 있 는 신분 인증 방안 이 어야 합 니 다.
        큰 글 자 를 써 서 설명 하고 싶 지 않 습 니 다. 알 아 볼 수 있 는 것 은 코드 에 따라 보 세 요. 우선 프로 토 콜 가방 은 최소한 아래 의 몇 개의 필드 를 포함해 야 합 니 다.  
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

좋은 웹페이지 즐겨찾기