2014-12-19 3 views
2

부록 A.2.2에 설명 된 예제에서 사용 된 서명을 확인하기 위해 phpseclib를 사용하는 데 문제가 있습니다 (http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-38). 계수, 지수, 서명 및 표지로 사용 된 값은 명세서의 부록에서 나온 것입니다. 서명은 .NET을 사용할 때 확인하고 여러 입력 사양이 구현되어 있으므로 입력이 유효하다고 가정합니다. 필자는 phpseclib에 대한 이전의 경험이 없으며 키를로드하는 방법을 추측해야하고 설명서가 최소한으로 제공되므로 도움을 받으실 수 있습니다!phpseclib sha256 확인 문제

// per guzmar converts the encoding used in the ietf specification to a string 
function cpim_base64url_decode($data) { 
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, 
      '=', STR_PAD_RIGHT)); 
} 

$rsa = new Crypt_RSA(); 

$publicKeyUrlEncoded = "ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ"; 
$exponentUrlEncoded = "AQAB"; 
$publicKeyString = base64url_decode($publicKeyUrlEncoded); 
$exponentString = base64url_decode($exponentUrlEncoded); 

$pk = array(
    'e' => new Math_BigInteger($exponentString, -256), 
    'n' => new Math_BigInteger($publicKeyString, -256) 
); 

$rsa->setHash('sha256'); 
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); 

$tobesignedString = 'eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ'; 
$signatureUrlEncoded = "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"; 
$signatureString = base64url_decode($signatureUrlEncoded); 

$keyloadResult = $rsa->loadKey($pk, CRYPT_RSA_PUBLIC_FORMAT_RAW); 

$result = $rsa->verify($tobesignedString, $signatureString) ? 'verified' : 'unverified'; 
+0

특정 문제에 대해 명확하게하려면 서명을 확인해야하지만 그렇지 않습니다 –

+1

'n'구성 요소가 부정적 일 수 있습니까? –

+0

예 'n'이 (가) 음수입니다. –

답변

1

문제는 n이며 개인 지수가 음수 일 수 있습니다.

모듈러 산술은 음의 모듈러스에서는 작동하지 않습니다. 이것이 문제라면 라이브러리에 달려 있습니다. OpenSSL의 암호 관련 BN_ libs는 양수 값에 대해서만 사용되지만 Java와 같은 음수 값을 갖는 두 개의 보수 구현을 사용하는 다른 라이브러리에도 동일한 문제가 있습니다.

RSA에서 사용되는 숫자에 항상 0 값 바이트를 접두사로 붙일 수 있습니다. RSA는 모듈러 산술을 기반으로하며 키의 구성 요소에 음수 값을 사용하지 않습니다.

+0

저는이 라이브러리에 익숙하지 않습니다. 필자의 의견으로는'$ pk'에 이미 음수가 포함되어 있기 때문에 라이브러리 함수는 오류가 발생하고 탈출해야한다. 입력을 "고정"하는 것은 갈 방법이 아니라 오히려 "빨리 실패"하는 것을 만듭니다. 아직 답변에서 빠진 것이 있습니까? –

+0

답변에 만족하면 답변의 왼쪽에있는 V 버튼 인 수락 버튼을 누르십시오. 답변 된 질문을 공개하지 마십시오. 의견을 후속 조치하거나 수락하십시오. 당신은 * 받아 들일 수는 없지만, 문제가 해결되었다는 것을 보여줄 것을 권장합니다 (그리고 필요하다면 나중에 변경할 수 있습니다). 다른 사람들이 시도 할 수 있도록 필요한 코드를 포함시키는 것이 가장 좋습니다. 그렇지 않으면 올바른 API 함수 또는 표준에 연결하십시오. 오, 물론 환영합니다 :) –