1. 程式人生 > >Java加密與安全

Java加密與安全

encoder 解碼 main 處理 沖突 lencod 發送 val 是什麽

一、簡介

數據安全

  • 防竊聽
  • 防篡改
  • 防偽造
    古代加密方式:
  • 移位密碼:HELLO => IFMMP 按照英文順序往後移動一位
  • 替代密碼:HELLO =>p12,5,3 或者是用某一本書的第幾頁第幾行第幾個字達到替換密碼的目的

這些都是靠人的想象和直覺來涉及的,非常不靠譜,而現代計算機加密:

  • 建立在嚴格的數據理論基礎上
  • 密碼學逐漸發展成一門學科

總結

  • 設計一個安全的加密算法非常困難
  • 驗證一個加密算法是否安全更加困難
  • 當前被認為安全的加密算法僅僅是迄今為止尚未被攻破
  • 不要 自己設計加密算法
  • 不要 自己實現加密算法
  • 不要 自己修改已有的加密算法

二、URL編碼

一、什麽是URL編碼?
URL編碼是瀏覽器發送數據給服務器時使用的編碼。

  • key1=value1&key2=value2&key3=valuye
  • q=%E4%B8%AD%E6%96%87

什麽是編碼?
ascii碼就是一種編碼,例如

字母 編碼(16進制)
A 0x41
B 0x42
C 0x43
D 0x44
... ...

漢字 Unicode編碼 UTF-8編碼
0x4e2d 0xe4b8ad
0x6587 0xe69687
0x7f16 0xe7bc96
0x7801 0xe7a081
... ... ...

URL編碼規則是什麽?

  • A-Z,a-z,0-9以及**-_.***保持不變
  • 其他字符以%XX表示
    例如:
    1.<:%3C
    2.中:%E4%B8%AD(utf-8:0xe4b8ad)

例子

/**
 * URL編碼
 */
public class SecURL {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String original = "URL 參數";
        String encoded = URLEncoder.encode(original,"UTF-8");
        System.out.println("編碼後:"+encoded);
        String ori = new String(URLDecoder.decode(encoded,"UTF-8"));
        System.out.println("解碼後:"+ori);
    }
}

技術分享圖片

總結

  • URL編碼是編碼算法,不是加密算法
  • URL編碼的目的是把任意文本數據編碼為%前綴表示的文本,編碼後的文本僅包含A-Z,a-z,0-9以及-_.,%*便於瀏覽器和服務器處理

二、Base64編碼
* 什麽是Base64編碼?
是一種把二進制數據用文本表示的編碼算法,例如:byte[]{0xe4,0xb8,0xad} ==> "5Lit"

索引 編碼 索引 編碼 索引 編碼
0 A 26 a 52 0
1 B 27 b 53 1
2 C 28 c ... ...
3 D 29 d 61 9
... ... ... ... 62 +
25 Z 51 z 63 /

目的

  • 是一種用文本(A-Z,a-z,0-9,+/=)表示二進制內容的方式
  • 適用於文本協議
  • 效率下降
    因為二進制經過base64編碼它的長度會增加三分之一,如果數組的長度不是3的整數倍,末尾補0x00或0x00 0x00
    編碼後加=表示補充了1個字節
    編碼後加==表示補充了2個字節
    應用
  • 電子郵件協議
/**
 * Base64編碼
 */
public class SecBase64 {

    public static void main(String[] args) throws Exception {
        String original = "Hello\u00ff編碼測試";
        //withoutPadding()可以去掉編碼後“=”這個字節,有沒有=對於解碼來說沒有影響
        String b64 = Base64.getEncoder().withoutPadding().encodeToString(original.getBytes("UTF-8"));
        System.out.println(b64);
        String ori = new String(Base64.getDecoder().decode(b64), "UTF-8");
        System.out.println(ori);
    }
}

技術分享圖片
由於標準的base64在url中會引起沖突,所以在url中使用base64編碼會使用另外一種。
技術分享圖片
在java中,使用url的base64編碼它會把“+”變為“-”,把“/"變為“_”這樣在傳遞url參數的時候不會引起沖突

總結

  • Base64是編碼算法,不是加密算法
  • Base64編碼的目的是把任意二進制數據編碼為文本(長度增加1/3)
  • 其他編碼:Base32、Base48、Base58

三、摘要算法

一、什麽是摘要算法?

Java加密與安全