1让网、字符串的編碼、解碼
編碼:將計(jì)算機(jī)中的字符串按照一定的順序表示成二進(jìn)制數(shù)據(jù)的過(guò)程
二進(jìn)制: | 0/1 每一個(gè)二進(jìn)制數(shù)字师痕,表示一位溃睹,通常計(jì)算機(jī)中:0000 0001 |
字節(jié): | 二進(jìn)制數(shù)據(jù)~8位一個(gè)字節(jié):0000 0001->1個(gè)字節(jié) |
字符: | 2個(gè)字節(jié)->1個(gè)字符;通常情況下我們使用的字符串~就是使用字符編碼的七兜! |
各國(guó)字符編碼都不一樣:
1丸凭、計(jì)算機(jī)-> 表示[英文字母福扬、數(shù)字腕铸、部分特殊符號(hào)]-> ascii編碼[0~256]
2、萬(wàn)國(guó)碼铛碑,統(tǒng)一字符編碼[號(hào)稱可以統(tǒng)一全球范圍內(nèi)任何語(yǔ)言的表示方式]
任何語(yǔ)言中的任何數(shù)據(jù)狠裹,都可以使用一個(gè)字符來(lái)表示unicode編碼
3、中國(guó)有GB2312-> GBK -> GB18030
4汽烦、數(shù)據(jù)傳輸編碼:unicode transfer format 8 bit [UTF-8]
python中的編碼解碼:
要命的規(guī)則:字符串的編碼解碼涛菠,一直都是任何語(yǔ)言中一個(gè)難點(diǎn)和重點(diǎn)
任何字符串->都是由字節(jié)組成的!
python3中:字符:(str)撇吞;字節(jié)(bytes)
字符->字節(jié):encode 編碼:將一個(gè)字符串編碼成計(jì)算機(jī)可以操作的二進(jìn)制數(shù)據(jù)
字節(jié)->字符:decode 解碼:將一個(gè)二進(jìn)制數(shù)據(jù)按照指定的編碼~解碼成自然數(shù)據(jù)
s = “大天朝” s:<class ‘str’>
x = s.encode(“utf-8”) x:<class ‘bytes’>
x-> b’\xb9\x00\xa5..’
x2 = x.decode(“utf-8”) x2:<class ‘str’>
x2 -> “大天朝”
2俗冻、加密解密操作:
什么是加密:將一個(gè)明文數(shù)據(jù),按照指定的算法牍颈,運(yùn)算得到一個(gè)其他的可以隱藏真實(shí)信息的密文數(shù)據(jù)迄薄,這個(gè)過(guò)程稱為加密;處理的算法稱為加密算法煮岁;用到的關(guān)鍵數(shù)據(jù)稱為密鑰
什么是解密:按照指定的算法和關(guān)鍵數(shù)據(jù)讥蔽,將一個(gè)密文數(shù)據(jù)進(jìn)行逆向運(yùn)算得到正確的明文數(shù)據(jù)的過(guò)程成為解密操作
(1)、單向加密算法:只能加密画机,不能解密的算法
如:用戶賬號(hào)密碼(單向加密)存儲(chǔ)冶伞,此時(shí)任何人都不能查看該用戶的明文密碼
流程->用戶輸入明文密碼->加密->和存儲(chǔ)的密文密碼進(jìn)行比較->相等-成功
單向散列加密算法-> MD5加密
單項(xiàng)哈希加密算法-> SHAX加密
(2)、雙向加密算法:可以加密步氏,加密的數(shù)據(jù)可以解密得到明文數(shù)據(jù)
使用在更多的場(chǎng)景响禽;數(shù)據(jù)進(jìn)行加密傳輸->目標(biāo)地址->解密得到明文數(shù)據(jù)進(jìn)行處理
對(duì)稱加密:加密和解密使用相同的秘鑰;
非對(duì)稱加密:加密和解密使用不同的秘鑰;如HTTPS傳輸數(shù)據(jù)
python中的hashlib模塊
hashlib主要提供字符加密功能芋类,將md5和sha模塊整合到了一起瀑焦,支持md5,sha1, sha224, sha256, sha384, sha512等算法
import hashlib
string = "beyongjie"
md5 = hashlib.md5()
md5.update(string.encode('utf-8')) #注意將字符串轉(zhuǎn)碼
res = md5.hexdigest() #加密后的字符串
print("md5加密結(jié)果:",res)
#其他加密都差不多
注意:hashlib 加密啊的字符串類型為二進(jìn)制編碼,直接加密字符串會(huì)報(bào)如下錯(cuò)誤:
TypeError: Unicode-objects must be encoded before hashing
有兩種方式可以將字符串轉(zhuǎn)化為二進(jìn)制數(shù)據(jù)
- 可以使用encode進(jìn)行轉(zhuǎn)換
string = "beyongjie"
shaa1 = hashlib.sha1()
shaa1.update(string.encode('utf-8'))
res = shaa1.hexdigest()
print("sha1采用encode轉(zhuǎn)換加密結(jié)果:",res)
- 或者使用byte轉(zhuǎn)換為二進(jìn)制
shab1 = hashlib.sha1()
shab1.update(bytes(string,encoding='utf-8'))
res = shab1.hexdigest()
print("sha1采用byte轉(zhuǎn)換的結(jié)果:",res)