Java加密與安全
阿新 • • 發佈:2019-03-03
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加密與安全