2011-02-03 3 views
1

Я пытаюсь создать клиент python для 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'

Там есть способ более простой, чем порт в Bacula реализации внешних о базе 64?

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

Для проверки реализации 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 часов, идентифицируя проблему и переопределяя ее.

Проблема в том, что основание Бакулы64 БРОКЕН, И НЕПРАВИЛЬНО!

Есть две проблемы, связанные с ним:

Первый является то, что входящие байты рассматриваются как знаковые, не без знака. Эффект от этого заключается в том, что если бит имеет наибольший бит (> 127), то он рассматривается как отрицательное число; когда он объединен с «оставшимися» битами из предыдущих байтов, все установлены в (двоичный 1).

Во-вторых, после того, как b64 обработал все полные 6-битные выходные блоки, может остаться 0, 2 или 4 бит (в зависимости от модуля входного блока 3). Стандартный способ 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 лет с тех пор, как вы спросили, но, возможно, кто-то найдет это полезным.

Смежные вопросы