2011-02-03 111 views
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的公司實行更簡單嗎?

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

您的標題和帖子似乎都被切斷了。 – 2011-02-03 13:53:24

回答

1

要驗證您的CRAM-MD5的實現,最好使用一些簡單的測試向量和檢查(挑戰,密碼,用戶名)輸入的組合與預期輸出。

這裏有一個例子(從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)。

第二個是,在b64處理完所有完整的6位輸出塊之後,可能還有0,2或4位(取決於輸入塊模數3)。處理這個問題的標準Base64方法是將剩餘的位相乘,因此它們是最後6位塊中的最高位,並對它們進行處理 - Bacula將它們保留爲最低位。請注意,Bacula的某些版本可能接受「Bacula破解base64編碼」和標準版本,用於傳入認證;他們似乎使用破碎的身份驗證。

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年了,但也許別人會覺得這很有用。