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

    私はbacula用のPythonクライアントを作成しようとしましたが、認証に問題があります。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のimplemenationよりも簡単な方法がありますか?あなたの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)を持つ場合、それは負の数として扱われます。それが前のバイトからの「左上」ビットと組み合わされるとき、すべては(バイナリ1)に設定される。

    第2の点は、b64がすべてのフル6ビット出力ブロックを処理した後で、入力ブロックモジュラス3に応じて、残りの0,2,4ビットが残っている可能性があることです。これを処理するための標準のBase64の方法は、残りのビットを乗算することです。したがって、最後の6ビットブロックの中で最も高いビットであり、それらを処理します.BaculaはそれらをLOWESTビットとして残します。

    Baculaのいくつかのバージョンでは、着信認証のために "Bacula broken base64 encoding"と標準のものを両方使用できます。彼らは彼らの認証のために壊れたものを使用するように見えます。

    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 
    

    あなたが質問してから6年経ちましたが、おそらく他の人がこれを役に立つと思います。

    関連する問題