2016-01-24 3 views
1

Следующий Java код:Base64 в Java и PHP

String ss = Base64.encodeBase64URLSafeString(xmlRequest.getBytes()); 
System.out.println(ss); 

Производит:

PHJlcXVlc3Q-PG1lcmNoYW50X2lkPjQ2PC9tZXJjaGFudF9pZD48b3JkZXJfaWQ-MzM8L29yZGVyX2lkPjxhbW91bnQ-MzwvYW1vdW50PjxkZXNjcmlwdGlvbj5oZWhlPC9kZXNjcmlwdGlvbj48L3JlcXVlc3Q- 

Хотя это PHP код:

$xml='<request><merchant_id>46</merchant_id><order_id>33</order_id><amount>3</amount><description>hehe</description></request>'; 
$xml_encoded = base64_encode($xml); 

Производит: PHJlcXVlc3Q + PG1lcmNoYW50X2lkPjQ2PC9tZXJjaGFudF9pZD48b3JkZXJfaWQ + MzM8L29yZGVyX2lkPjxhbW91bnQ + MzwvYW1vdW50PjxkZXNjcmlwdGlvbj5oZWhlPC9kZXNjcmlwdGl vbj48L3JlcXVlc3Q +

Один из них имеет - символов, а другой имеет +. Откуда эта разница?

+0

См. [Мой ответ] (http://stackoverflow.com/a/34976227/2071828) - не используйте тайные библиотеки третьей части, если в JDK есть объекты. –

ответ

4

См. this article для некоторых используемых вариантов. Похож, что - используется, когда представление должно быть безопасным для включения в URL-адрес, например. как аргумент запроса. Смотрите также Base64 исходный код:

/** 
* This array is a lookup table that translates 6-bit positive integer index values into their "Base64 Alphabet" 
* equivalents as specified in Table 1 of RFC 2045. 
* 
* Thanks to "commons" project in ws.apache.org for this code. 
* http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ 
*/ 
private static final byte[] STANDARD_ENCODE_TABLE = { 
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
     'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 
     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 
     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' 
}; 

/** 
* This is a copy of the STANDARD_ENCODE_TABLE above, but with + and/
* changed to - and _ to make the encoded Base64 results more URL-SAFE. 
* This table is only used when the Base64's mode is set to URL-SAFE. 
*/ 
private static final byte[] URL_SAFE_ENCODE_TABLE = { 
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
     'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 
     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 
     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 
     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' 
}; 
+1

Спасибо за ответ. –

0

Это происходит потому, что "URL-Safe Base64 Вариант", используемый Base64.encodeBase64URLSafeString() заменяет + и / с - и _:

Зашифровывает двоичных данных с использованием url- безопасное изменение алгоритма base64, но не вырезает вывод. Правильно подобранный вариант испускает - и _ вместо + и / символов. Примечание: добавление дополнений не добавляется.

Вы можете просто перевести два формата, изменяя + и / в - и _.

Чтобы получить выход, идентичный PHP, просто используйте Base64.encodeBase64String().

+1

Спасибо за ответ. –

+0

Без проблем, рад помочь! :) – Will

2

База 64 - это символы a-zA-Z0-9, а также + и / за последние два.

Чтобы сделать URL кодировки безопасным, мы не можем использовать /, поэтому последние два символа заменяются безопасными вариантами URL _ и -.

Если вы используете:

final Base64.Encoder encoder = Base64.getEncoder(); 
encoder.encodeToString(...) 

Вы получите тот же результат, как в примере PHP.

P.S. это новый класс java.util.Base64, встроенный в JDK - не нужно использовать тайную общую библиотеку.

+0

Спасибо за ответ. –

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