2016-11-11 3 views
0

Java에서 OpenID 1.1 공급자를 구현했지만 associate의 스마트 클라이언트에 문제가 있습니다. 다른 서명이 있습니다. check_authentication에 의존하는 멍청한 클라이언트는 정상적으로 작동합니다. 특히, 나는 라이브 저널에 대한 테스트입니다 그것은 반환 계속 :assoc_handle을 기반으로 OpenID 1.1 시그널을 생성하는 방법은 무엇입니까?

signature_mismatch을 : 이전 협회 ID 공급자 응답을 무효화.

HMAC() 기능의 본문은 다음과 같습니다 HMAC()를 호출

public static byte[] HMAC(byte[] secret, String token_contents) { 
    SecretKey sk = new SecretKeySpec(secret, "HMACSHA1"); 
    Mac m = Mac.getInstance(sk.getAlgorithm()); 
    m.init(sk); 
    return m.doFinal(token_contents.getBytes("UTF-8")); 
} 

token_contentscheckid_setup에 대한 처리시 다음 코드에서 온다. 즉, 서명은 mode,identity,return_to에서 이루어지며 이는 signed 응답 매개 변수의 값이기도합니다.

String token_contents = String.format(
    "mode:id_res\nidentity:%s\nreturn_to:%s\n", 
    identity, return_to); 

그리고 마지막 secret (예 사양에 따라 secret(assoc_handle) 통해 검색) 초기 associate 호출이 리턴 mac_key의베이스 64 디코딩 된 버전이다. enc_mac_key을 제대로 해독 할 수 있는지 확인하기 위해 상당한 양의 테스트를 수행했습니다.

의견이 있으십니까? 이 일에 눈부신 문제가 있습니까?

또는 ... 누구나 알고있는 OpenID 1.1을 알고 그 단계를 추적하는 간단한 독립 실행 형 클라이언트가 있습니까? 내가 물건을 다르게 계산하는 위치를 파악할 수 있다고 가정하면.

답변

0

내 경우의 문제점은 표준 base64 대신 키 값 (mac_key, enc_mac_key, dh_server_public)의 출력에 base64url encoding을 사용하고있었습니다. Apache Commons에서 나는 encodeBase64String 대신 encodeBase64URLSafeString을 사용하고있었습니다. 이것은 오픈 ID 에서 이전에에 연결 한 결과 불행한 이월이었고 기능의 본질을 오해했습니다.

어쨌든 대답을 찾는데 도움이되는 것은 OpenID4Java과 그 simple-openid JSP 샘플을 사용하는 것이 었습니다. 즉시 그것은 160 비트가 아니라 168 비트라고 불평하면서 내 서명의 오류를 막아 냈습니다.

관련 문제