數(shù)據(jù)安全
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務領域包括:做網(wǎng)站、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的兩當網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
這些都是靠人的想象和直覺來涉及的,非常不靠譜,而現(xiàn)代計算機加密:
總結
一、什么是URL編碼?
URL編碼是瀏覽器發(fā)送數(shù)據(jù)給服務器時使用的編碼。
什么是編碼?
ascii碼就是一種編碼,例如
字母 | 編碼(16進制) |
---|---|
A | 0x41 |
B | 0x42 |
C | 0x43 |
D | 0x44 |
... | ... |
漢字 | Unicode編碼 | UTF-8編碼 |
---|---|---|
中 | 0x4e2d | 0xe4b8ad |
文 | 0x6587 | 0xe69687 |
編 | 0x7f16 | 0xe7bc96 |
碼 | 0x7801 | 0xe7a081 |
... | ... | ... |
URL編碼規(guī)則是什么?
例子
/**
* URL編碼
*/
public class SecURL {
public static void main(String[] args) throws UnsupportedEncodingException {
String original = "URL 參數(shù)";
String encoded = URLEncoder.encode(original,"UTF-8");
System.out.println("編碼后:"+encoded);
String ori = new String(URLDecoder.decode(encoded,"UTF-8"));
System.out.println("解碼后:"+ori);
}
}
總結
二、Base64編碼
* 什么是Base64編碼?
是一種把二進制數(shù)據(jù)用文本表示的編碼算法,例如: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 | / |
目的
/**
* Base64編碼
*/
public class SecBase64 {
public static void main(String[] args) throws Exception {
String original = "Hello\u00ff編碼測試";
//withoutPadding()可以去掉編碼后“=”這個字節(jié),有沒有=對于解碼來說沒有影響
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編碼它會把“+”變?yōu)椤?”,把“/"變?yōu)椤癬”這樣在傳遞url參數(shù)的時候不會引起沖突
總結
一、什么是摘要算法?
摘要算法是一種能產(chǎn)生特殊輸出格式的算法,這種算法的特點是:無論用戶輸入多少長度的原始數(shù)據(jù),經(jīng)過計算后輸出的密文都是固定長度的,只要原數(shù)據(jù)稍有改變,輸出的“摘要”便完全不同,因此,基于這種原理的算法便能對數(shù)據(jù)完整性提供較為健全的保障。
? ? ? ? 常用的摘要算法主要有MD5和SHA1。D5的輸出結果為16字節(jié)(128位),SHA1的輸出結果為20字節(jié)(160位)。
摘要算法(又稱哈希算法/數(shù)字指紋)
* 計算任意成都數(shù)據(jù)的摘要(固定長度)
目的:
例如:
輸入:任意長度的數(shù)據(jù)(byte[])
輸出:固定長度的數(shù)據(jù)(byte[n])
hash("hello") = 0x5e918d2
hash("hello,java") = 0x7a9d88e8
hash("hello,bob") = 0xa0dbae2f
Java的Object.hashCode()方法就是一個摘要算法
這就是說相同的輸入必須得到相同的輸出,當我們重新equals()方法的時候也要同時重新hashCode()方法
什么是碰撞?
兩個不同的輸入得到了相同的輸出
例如:
hash("abc") = 0x12345678
hash("xyz") = 0x12345678
這個時候我們就說發(fā)生了碰撞,碰撞能不能呢,碰撞是不能避免的。
輸出的字節(jié)是固定的,而輸入的字節(jié)是不確定的
輸出n bits | 范圍 |
---|---|
0000000000 | 0 |
0000000001 | 1 |
0000000010 | 2 |
... | ... |
11111111111 | 62235 |
Hash算法的安全性?
常用摘要算法
彩虹表
什么是彩虹表呢?是一個預先計算好的常用的字符和md5的一個對照表。
抵御彩虹表
public static void main(String[] args) throws Exception{
String str = "MD5摘要算法測試";
byte[] bytes = toMD5(str.getBytes("UTF-8"));
//以16進制的方式,打印出byte數(shù)組
System.out.println(String.format("%032x",new BigInteger(1,bytes)));
}
public static byte[] toMD5(byte[] input){
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
}catch (Exception e){
throw new RuntimeException(e);
}
md.update(input);
return md.digest();
}
public static void main(String[] args) throws Exception{
String password = "helloworld";
String salt = "Random salt";
byte[] bytes = toMD5((salt+password).getBytes("UTF-8"));
//以16進制的方式,打印出byte數(shù)組
System.out.println(String.format("%032x",new BigInteger(1,bytes)));
}
public static byte[] toMD5(byte[] input){
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
}catch (Exception e){
throw new RuntimeException(e);
}
md.update(input);
return md.digest();
}
二、SHA-1
例子:同md5
public static void main(String[] args) throws Exception{
String str = "MD5摘要算法測試";
byte[] bytes = toMD5(str.getBytes("UTF-8"));
//由于SHA-1輸出是40個字節(jié),所以用%040x來表示輸出
System.out.println(String.format("%040x",new BigInteger(1,bytes)));
}
public static byte[] toMD5(byte[] input){
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA-1");
}catch (Exception e){
throw new RuntimeException(e);
}
md.update(input);
return md.digest();
}
jdk并未包含RipeMD160算法,需要單獨下載jar包放入jdk中
三、BouncyCastle
如何使用第三方提供的算法?
四、Hmac
Hmac:Hash-based Message Authentication Code
更安全的消息摘要算法
HmacMD5可以看做帶安全Salt的MD5
public class Hmac {
public static byte[] hmac(String hmacAlgorithm, SecretKey skey,byte[] input)throws Exception{
Mac mac = Mac.getInstance(hmacAlgorithm);
mac.init(skey);
mac.update(input);
return mac.doFinal();
}
public static void main(String[] args) throws Exception {
String algorithm = "HmacSHA1";
//String algorithm = "HmacSHA256";
//原始數(shù)據(jù)
String data = "hello world";
//隨機生成一個key
KeyGenerator keyGen = KeyGenerator.getInstance(algorithm);
SecretKey skey = keyGen.generateKey();
//打印key
byte[] key = skey.getEncoded();
BigInteger bigInteger = new BigInteger(1, key);
System.out.println("Key:"+bigInteger.toString(key.length/2));
//用這個key計算
byte[] result = hmac(algorithm,skey,data.getBytes("UTF-8"));
BigInteger resultInteger = new BigInteger(1, result);
System.out.println("Hash:"+resultInteger.toString(result.length/2));
}
}
總結:
一.什么是對稱加密算法
二、常用的加密算法
它們的密鑰長度各不相同,密鑰長度決定了加密的強度。工作模式和填充模式可以看做是加密算法的參數(shù)和格式的選擇,jdk提供的算法并沒有提供所有的工作模式及填充模式。
des算法因為密鑰果斷可以在短時間內(nèi)暴力破解,已經(jīng)被淘汰
文章名稱:Java加密與安全
分享路徑:http://muchs.cn/article44/jchphe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、商城網(wǎng)站、做網(wǎng)站、網(wǎng)站策劃、云服務器、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)