2013-02-19 3 views
2

Я пытаюсь создать функцию, которая будет запускать частные вызовы API на некоторых сайтах. Все эти сайты используют проверку подлинности с подписью вызова API следующим образом в PHP:base64 decode - nul in string

base64_encode(hash_hmac('sha512', $post_data, base64_decode($secret), true)) 

Использование пакета дайджеста и RCurl я могу легко написать как:

base64Encode(hmac(key = base64Decode(secret), object = post_data, algo = 'sha512', raw = TRUE)) 

Я борюсь целый день HMAC ввода ключа параметр:

key = base64Decode(secret) 

вопрос заключается в том, что функция HMAC принимает только строковое значение, но base64Decode может вернуть что-то большее, чем просто строки:

str(base64Decode(secret)) 
chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__ 

Это __truncated__ является ключевым вопросом здесь. Так что следующая вещь, которую я попытался было взять сырой выход из функции декодирования и rawToChar на нем:

str(base64Decode(secret,mode='raw')) 
raw [1:64] ee e3 3f be ... 

rawToChar(base64Decode(secret,mode='raw')) 

Ошибка в rawToChar (base64Decode (секретный режим = «сырой»)): встроенный NUL в строка: 'îă? ľÂÜĄ \ vŽĺ \ 022 \ 0!^\ 026Č <¶ © wŚ0Î \ 035ë \ 026 \ r \ 001ňKÍ "Rř \ 003j" 7¤Ň \ nťä_ \ 004m @ ß \ 0Ă "c \ 0271˝ ZnĚ55'v»

Как мы видим сейчас, есть тайна NUL вещь где-то в моей (даже не) струна. Я не слишком заботится о NUL s, мне просто нужно передать эту часть данных в качестве ввода для hmac.

  1. Есть ли возможность обрабатывать строку с помощью nul, только для того, чтобы нажимать ее дальше, как входная верхняя функция?
  2. Есть ли возможность иметь функцию hmac ключ параметр принимает исходный объект?

Я пробовал также пакет base64enc без успеха. Я пробовал много разных конверсий, но все возвращается к этой простой «нулевой строке».

Эти сайты являются довольно новыми, и этот процесс аутентификации выглядит как стандартный API-интерфейс между ними. Там должен быть какой-то способ справиться с этим процессом в R.

Если кто-то хочет проверить,

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg==' 
+0

Я получаю такую ​​же проблему. base64Decode урезает результаты при выводе символов по какой-либо причине ... – bumpkin

+0

@bumpkin использует 'raw' вместо' character'. – jangorecki

+0

Вот что я в итоге сделал. Благодаря! – bumpkin

ответ

2

Ответ на вопрос 2. является:

функция HMAC уже принимает необработанный объект вместо строки.

Это решение:

hmac(key = base64Decode(secret, mode='raw'), 
object = post_data, 
algo = 'sha512', 
raw = TRUE) 
1

Я действительно не уверен, что й truncated проблема. Когда вы примените str к вашему выходу, вы попросите его отобразить его структуру. Вот что он делает:

chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__ 

chr означает, что объект класса character (строка). str затем отображает начало строки, помещает усеченный ее вывод. Следовательно, truncated отображается по str.Если вы хотите, чтобы отобразить полную строку, просто введите его имя или print:

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg==' 
str(base64Decode(secret)) 
# chr "\xee\xe3?\xbe\xc2ܥ\v\x8e\x98\xe5\022" 

Так что я полагаю, что проблема не связана с функцией base64Decode, но в другом месте в сценарии.

+0

Это не вся строка, передавая ее в hmac, создаст разные результаты. Можете ли вы попробовать тот же base64decode в другом инструменте, например php. Это будет по-другому. Или вы можете просто base64Decode как raw и сделать rawToChar на нем, тогда вы увидите всю строку. – jangorecki

+0

@MusX в моей системе, как R, так и php дают одинаковые результаты, в символе или в двоичном режиме ... – juba

+0

вы можете попробовать 'rawToChar (base64Decode (secret, mode = 'raw'))' и проверить, какая строка это попытается вернуться? как вы можете видеть в моем сообщении, в сообщении об ошибке есть большая строка, эта большая строка усекается точно в месте, где символ «\ 0», если вы используете Google для «\ 0», вы обнаружите, что это ** nul ** знак. И строка была усечена в точке, где nul происходил. – jangorecki