base64javaphp
A. php 圖片用base64轉碼完的文本比以前還大 是為什麼
base64轉碼會把原有圖片的像素數據轉成字元數據保存,當需要使用的時候,再把字元數據轉化為圖片數據顯示.
大小問題:
base64是通過文字記錄像素方式來保存圖片,與原有的二進制保存圖片方式並不同,所以不論變大變小都是正常現象.
為何還要使用base64.使用base64保存圖片並不是為了節省存儲空間,而是為了減少請求.要知道請求耗時且費伺服器.如果一個H5頁麵包含有100張圖片,那麼用戶打開一次,至少要請求100次圖片,1次html文件,css文件和js文件都要請求.這么下來,如果1000人同時打開,伺服器就瞬間達到了1000*101次100000並發量,無形之中增加了伺服器巨大的成本.
而使用base64,把圖片數據全部存在一個js文件中,一次請求就2次,一個html文件和一個images.js文件.伺服器1000人同時並發也就2000量級.減少伺服器壓力.
同時,應為只需要請求2個文件,請求時間大大縮短,用戶打開速度幾乎之和伺服器帶寬有關系,不用考慮過多的域名解析時間與請求時間.
B. php的base64加密,怎麼調整才能和java的base64的加密結果一致呢
phpbase64以後每76個字元加一個換行,
function javaBase64Encode($str)
{
$str = base64_encode($str);
$strLength = strlen($str);
$n = intval($strLength / 76);
if ($n <= 0) {
return $str;
}
for ($i = 1; $i <= $n; $i++) {
$position = 76 * $i + ($i - 1);
$str = substr_replace($str, PHP_EOL, $position, 0);
}
return $str;
}
function javaBase64Decode($str)
{
$strLength = strlen($str);
$n = intval($strLength / 76);
if ($n <= 0) {
return $str;
}
for ($i = $n; $i >= 1; $i--) {
$position = 76 * $i + ($i - 1);
$str = substr_replace($str, "", $position, 1);
}
return base64_decode($str);
}
或者使用chunk_split 函數也可以,默認就是76,而且不是所有的java代碼都需要這樣轉,要看java調用的是什麼類庫,有一些是不用的
C. Base64演算法原理及實現
Base64演算法最開始是被用於解決電子郵件數據傳輸問題。在早期,由於歷史原因問題,電子郵件只允許使用ASCII字元,如果在郵件中出現了非ASCII字元,在通過某些網關進行數據轉發的時候,網關會對這些非ASCII字元做出調整,例如,把ASCII碼8位二進制碼的最高位置為0。此時接收方在收到郵件時就會出現亂碼。基於這個原因,產生了Base64演算法。
Base64編碼的思路說白了,就是把傳輸數據的每個位元組映射成ASCII碼表中的某些字元,這樣在傳輸的過程中,就不會出現亂碼的問題了。Base64演算法定義了一個映射表,如下所示。
由上表可以看出,之所以稱為Base64編碼,實際上是把原數據映射成了ASCII碼表中的64個字元。但是,64個字元最多能映射的位數是6bit。但是每個數據是8bit的,那怎麼轉換呢?Base64編碼的基本思想: 將原數據每3個位元組(24bit)分為一組,然後將這24bit數據按照每6bit一組,重新劃分為4組,分組完成之後,再將每每6bit數據為單元進行映射。
Base64編碼的基本流程如下:
例如,將字元串"ABC"進行Base64編碼流程如下。
所以,字元串"ABC"經過Base64編碼後的數據是"QUJD"。
從Base64編碼的原理可以看到,Base64實際上就是把原來數據中的每3個位元組一組進行Base64編碼轉換,編碼之後變成4個Base64字元。但是如果原文數據長度不是3的整數倍的時候該怎麼辦呢?Base64演算法規定,如果待加密數據不是3的整數倍,就在原文數據後面補0,直到長度湊夠3的整數倍為止,然後再進行Base64編碼轉換。待編碼轉換完成之後,在結果末尾補充相同個數的"="。
例如,將字元串"ABCD"進行Base64編碼流程如下。
所以,字元串"ABC"經過Base64編碼後的字元串是"QUJDRA=="。
其實這里有個規律,當原文的數據長度除以3餘數為0時,編碼之後後面沒有"=";當余數為1時,後面有兩個"=",當余數是2時,後面有一個"=","="的個數也就是補充的位元組數。
通過Base64的原理可以看到,Base64編碼實際上是把原數據的3個位元組映射成了4個位元組,所以相比於原數據長度,編碼後的長度會增加1/3。這也會降低傳輸效率。
Get方式和Post方式是Http請求常用的兩種方式,某些情況下會要求使用Get方式來傳遞二進制數據。這時,可以先通過Base64編碼來將二進制數據轉換成字元串數據。由於符號"+"和符號"/"是不允許出現在Url中的,所以,產生了Url安全的Base64演算法,所謂的Url安全的Base64演算法,其實主要包含兩個方面。
目前,在Java中,我們可以通過以下方式來是使用Base64演算法。
在java8之前,JDK官方庫中都沒有內置Base64演算法,其實Base64實現很簡單,這個不知道為什麼。但是Java8內置了Base64編碼器和解碼器。
在Java8中,Base64工具類提供了三種BASE64編解碼器:
1.基本Base64編碼
也就是完全按照標准Base64的映射規則來編解碼,不添加任何行標。
2.Url Base64編碼
JDK標准類庫中的Url Base64編碼是用"-"和"_"取代了"+"和"/"
3.MIME Base64編碼
Java類庫中還提供了一種格式更友好的Base64編碼,這種編碼輸出每行不超過76字元,並且使用'
'並跟隨'
'作為分割。
4.去除填充符的Base64
在Java標准類庫中,還提供了一種方式來去除編碼末尾的"=",就是在構建Encoder 對象後調用withoutPadding()方法,例如:
Commons Codec是Apache為Java開發者提供的一個開源軟體類庫,該類庫中主要是一些常用的編碼工具類包,例如DES、SHA1、MD5、Base64,URL等。在使用該類庫之前需要首先在Eclipse中添加依賴。Commons Codec提供了以下Base64編碼方式。
1.基本Base64編碼
Commons Codec和Java標准類庫提供給的Base64編碼方式是一樣的。
2.Url Base64編碼
Url Base64編碼和Java類庫也是一樣的,把"+"和"/"替換成了"-"和"_",有一個不同的地方是Commons Codec中的Url Base64默認去掉了後面的"=",相當於Java類庫中調用了withouPadding方法,例如:
3.類MIME格式輸出
Commons Codec中也提供了類似於Java類庫中的MIME的格式化輸出,在Commons Codec中有一個方法:
這里的isChunked置為true,就表示是按照MIME格式輸出編碼結果。
h
D. php如何判斷一個字元串是不是base64編碼
參考思路:PHP判斷一個字元串是否經過base64編碼,可以通過對該字元串解碼,然後編碼,最後對比兩者是否相等。示例代碼如下:
<?php
header("Content-type:text/html;charset=utf-8;");
$str="Y2hpbmF3aW54cA==";
$re=is_base64($str);
if($re){
echo "該字元串是base64編碼";
}else{
echo "該字元串未經過base64編碼";
}
//判斷字元串是否經過編碼方法
function is_base64($str){
if($str==base64_encode(base64_decode($str))){
return true;
}else{
return false;
}
}
?>
E. 求教PHP和JAVA大神 base64_encode(hash_hmac('sha1',$public_key,$private_key,TRUE)); 轉 java
如果你的API服務安全認證協議中要求使用hmac_sha1方法對信息進行編碼,
而你的服務是由PHP實現的,客戶端是由JAVA實現的,那麼為了對簽名正確比對,就需要在兩者之間建立能匹配的編碼方式.
efine('ID','123456');
define('KEY','k123456');
$strToSign = "test_string";
$utf8Str = mb_convert_encoding($strToSign, "UTF-8");
$hmac_sha1_str = base64_encode(hash_hmac("sha1", $utf8Str, KEY));
$signature = urlencode($hmac_sha1_str);
print_r($signature);
JAVA側需要注意如下幾點:
1. hmac_sha1編碼結果需要轉換成hex格式
2. java中base64的實現和php不一致,其中java並不會在字元串末尾填補=號以把位元組數補充為8的整數
3. hmac_sha1並非sha1, hmac_sha1是需要共享密鑰的
參考實現如下:
[java] view plain
import java.io.UnsupportedEncodingException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.wicket.util.crypt.Base64UrlSafe;
public class test {
public static void main(String[] args) {
String key = "";
String toHash = "GET"+"\n"+"Thu, 09 Aug 2012 13:33:46 +0000"+"\n"+"/ApiChannel/Report.m";
//String toHashUtf8 = URLEncoder.encode(toHash, "UTF-8");
String res = hmac_sha1(toHash, key);
//System.out.print(res+"\n");
String signature;
try {
signature = new String(Base64UrlSafe.encodeBase64(res.getBytes()),"UTF-8");
signature = appendEqualSign(signature);
System.out.print(signature);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String hmac_sha1(String value, String key) {
try {
// Get an hmac_sha1 key from the raw key bytes
byte[] keyBytes = key.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
// Get an hmac_sha1 Mac instance and initialize with the signing key
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
// Compute the hmac on input data bytes
byte[] rawHmac = mac.doFinal(value.getBytes());
// Convert raw bytes to Hex
String hexBytes = byte2hex(rawHmac);
return hexBytes;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String byte2hex(final byte[] b){
String hs="";
String stmp="";
for (int n=0; n<b.length; n++){
stmp=(java.lang.Integer.toHexString(b[n] & 0xFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
}
return hs;
}
private static String appendEqualSign(String s){
int len = s.length();
int appendNum = 8 - (int)(len/8);
for (int n=0; n<appendNum; n++){
s += "%3D";
}
return s;
}
}
參考:http://www.iteye.com/topic/1002652
F. php base64 加密 和javascript base64 不一樣
你在線加密用的是GB2312
而你PHP採用的是UTF-8
這兩種編碼編出來的位元組是不一樣
因此BASE64通過位元組編碼的
導致你看到的結果不一樣。
如果你想PHP加出來和在線加密一樣,你可以把編碼轉一致就可以了。
<?php echo base64_encode(iconv('utf-8','gbk',"胡蘿卜")); ?>
這樣子就能和在線加密是一樣的了。
G. php圖片轉base64並保存為文本
php圖片轉base64並保存為文本方法如下:
PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
Base64是網路上最常見的用於傳輸8Bit位元組代碼的編碼方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的詳細規范。Base64編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的唯一標識符(一般為128-bit的UUID)編碼為一個字元串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。