python
  • base64
  • bacula
  • 2011-02-03 6 views 1 likes 
    1

    bacula 용 파이썬 클라이언트를 만들려고하는데 인증에 문제가 있습니다.Base64 및 비표준

    알고리즘은 다음과 같습니다

    
    import hmac 
    import base64 
    import re 
    
    ... 
    
    challenge = re.search("auth cram-md5()", data) 
    #exemple '' 
    passwd = 'b489c90f3ee5b3ca86365e1bae27186e' 
    hm = hmac.new(passwd, challenge).digest() 
    rep = base64.b64encode(hm).strp().rstrip('=') 
    #result with python : 9zKE3VzYQ1oIDTpBuMMowQ 
    #result with bacula client : 9z+E3V/YQ1oIDTpBu8MowB'

    방법베이스 (64)의 bacula의 된 구현 포트보다 더 간단있다? 당신의 CRAM-MD5 구현을 확인하려면

    int 
    bin_to_base64(char *buf, int buflen, char *bin, int binlen, int compatible) 
    { 
        uint32_t reg, save, mask; 
        int rem, i; 
        int j = 0; 
    
        reg = 0; 
        rem = 0; 
        buflen--;      /* allow for storing EOS */ 
        for (i=0; i >= (rem - 6); 
         if (j
    +2

    제목과 게시물이 중간에 잘린 것처럼 보입니다. –

    답변

    1

    , 그것은 몇 가지 간단한 테스트 벡터를 사용하여 예상 출력에 대해 (도전, 비밀번호, 사용자 이름) 입력의 조합을 확인하는 것이 좋습니다.

    여기 (http://blog.susam.in/2009/02/auth-cram-md5.html에서) 하나의 예입니다 : 말했다

    import hmac 
    username = '[email protected]' 
    passwd = 'drowssap' 
    encoded_challenge = 'PDc0NTYuMTIzMzU5ODUzM0BzZGNsaW51eDIucmRzaW5kaWEuY29tPg==' 
    challenge = encoded_challenge.decode('base64') 
    digest = hmac.new(passwd, challenge).hexdigest() 
    response = username + ' ' + digest 
    encoded_response = response.encode('base64') 
    print encoded_response 
    # Zm9vQHN1c2FtLmluIDY2N2U5ZmE0NDcwZGZmM2RhOWQ2MjFmZTQwNjc2NzIy 
    

    , 나는 확실히 위의 코드에 의해 생성 된 응답은 관련 사이트에 명시된 예상 응답에서 차이가 그물에 예제를 발견했습니다, 그래서 나는 그 사건들에서 어떤 일이 일어나고 있는지에 대해 아직 명확하지 않다.

    0

    나는 이것을 괴롭혔다.

    정확히 같은 문제가 발생하여 문제를 확인하고 다시 구현하는 데 약 4 시간을 소비했습니다.

    문제는 Bacula의 base64가 잘못되었거나 잘못되었습니다!

    이 두 가지 문제가 있습니다

    첫 번째는, 서명하지 서명으로 들어오는 바이트가 처리되어있다가. 이 효과는 바이트가 가장 높은 비트 세트 (> 127)를 가지면 음수로 처리된다는 것입니다. 이전 바이트의 "left over"비트와 결합 될 때 모두 2 진 1로 설정됩니다.

    둘째, b64가 모든 전체 6 비트 출력 블록을 처리 한 후 입력 블록 모듈 수 3에 따라 0, 2 또는 4 비트 남을 수 있습니다. 이것을 처리하는 표준 Base64 방법은 남은 비트를 곱하는 것입니다. 따라서 마지막 6 비트 블록에서 가장 높은 비트가되고 처리됩니다. Bacula는이 비트를 최하위 비트로 남겨 둡니다.

    일부 버전의 Bacula는 들어오는 인증을 위해 "Bacula broken base64 encoding"과 표준 Bakulom 인코딩을 모두 허용 할 수 있습니다. 그들은 인증을 위해 깨진 것을 사용하는 것 같습니다.

    def bacula_broken_base64(binarystring): 
        b64_chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 
        remaining_bit_count=0 
        remaining_bits=0 
        output="" 
        for inputbyte in binarystring: 
         inputbyte=ord(inputbyte) 
         if inputbyte>127: 
          # REPRODUCING A BUG! set all the "remaining bits" to 1. 
          remaining_bits=(1 << remaining_bit_count) - 1 
         remaining_bits=(remaining_bits<<8)+inputbyte 
         remaining_bit_count+=8 
         while remaining_bit_count>=6: 
          # clean up: 
          remaining_bit_count-=6 
          new64=(remaining_bits>>remaining_bit_count) & 63 # 6 highest bits 
          output+=b64_chars[new64] 
          remaining_bits&=(1 << remaining_bit_count) - 1 
        if remaining_bit_count>0: 
         output+=b64_chars[remaining_bits] 
    
        return output 
    

    나는 당신이 물었지만, 아마도 다른 사람이 유용하게 찾을 수 있기 때문에 육년이었다 알고 있습니다.

     관련 문제

    • 관련 문제 없음^_^