base64phpjava
1. php base64 加密 和javascript base64 不一樣
你在線加密用的是GB2312
而你PHP採用的是UTF-8
這兩種編碼編出來的位元組是不一樣
因此BASE64通過位元組編碼的
導致你看到的結果不一樣。
如果你想PHP加出來和在線加密一樣,你可以把編碼轉一致就可以了。
<?php  echo  base64_encode(iconv('utf-8','gbk',"胡蘿卜")); ?>
這樣子就能和在線加密是一樣的了。
2. 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調用的是什麼類庫,有一些是不用的
3. java base64
java base64是什麼,讓我們一起了解一下?
 
 Base64是一種編碼方法,要求把每三個8Bit的位元組轉換為四個6Bit的位元組,轉換之後的這四個位元組中每6個晌慧穗有效bit為有效數據,空餘的那兩個bit用0補上成為一個位元組。
 
 為什麼要使用Base64?
 
 Base 64主要用途不是加密,而是把一些二進制數轉成普通字元,方便在網路上傳輸。 由於一些二進制字元在傳輸協議中屬於控制字元,不能直接傳送,所以需要轉換一下才可以。由於某些系統中只能使用ASCII字元,Base64就是用來將非ASCII字元的數據轉換成ASCII字元的一種方法,Base64特別適合在http,mime協議下快速傳輸數據。
 
 比如網路中圖片的傳輸Base64,並非安全領域下的加密解密演算法。雖然經常遇到所謂的base64的加密解密。但base64隻能算是一個編碼演算法,對數據內容進行編碼來適合傳輸。雖然base64編碼過後原文也變成不能看到的字元格式,但是方式初級又簡單。
那在Java中想要實現Base64的加解密,有哪些方式?
 
 主要有以下四種(推薦度由低到高):
 
 1、JDK中的宴卜sun.misc套碧桐件。
 
 2、第三方擴展包 bouncy castle。
 
 3、第三方擴展包 commons codec。
 
 4、JDK8及更高版本中的 java.util.Base64。
 
 實戰操作,JDK實現代碼如下:  import sun.misc.BASE64Decoder;    import sun.misc.BASE64Encoder;    /** * BASE64加密解密 */    public class BASE64 {        /** * BASE64解密 * @param key * @return * @throws Exception */        public static byte[] decryptBASE64(String key) throws Exception {            return (new BASE64Decoder()).decodeBuffer(key);        }        /** * BASE64加密 * @param key * @return * @throws Exception */        public static String encryptBASE64(byte[] key) throws Exception {            return (new BASE64Encoder()).encodeBuffer(key);        }        public static void main(String[] args) throws Exception {            String data = BASE64.encryptBASE64("http://aub.iteye.com/".getBytes());            System.out.println("加密前:" + data);            byte[] byteArray = BASE64.decryptBASE64(data);            System.out.println("解密後:" + new String(byteArray));        }    }
4. 求教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
5. java base64解碼 怎麼是亂碼呢
會亂碼的原因是你的編碼不一致導致的
php中的urlencode的編碼是和系統編碼一致的(比如windows默認gb2312,ubuntu默認utf-8)
所以首先需要確定你的系統編碼,之後根據得到的系統編碼在調用java的decode方法的時候,將這個編碼傳入(考慮到你的例子中有繁體字,所以,建議你使用utf-8編碼),以下是我使用utf-8編碼的例子(php環境是ubuntun下)

