摘要:這一條是我加的,能搜到很多混淆的方法但它們可能要求在之內,比如對求一個,這是一個不錯的方法但因為這個限制我沒有采用它。
眾所周知,在web應用的API中,總是會出現數據庫item的id。比如GET /posts/1表示獲取id為1的文章內容。這樣做十分簡潔,但存在被人爬數據的風險。比如我可以大致猜測或者試一下id的范圍,1,2,3...10000這樣迭代地爬數據。如果服務器不做訪問限制,很輕易就能把所有數據就能爬下來。而且,這樣的數字id也會暴露一些信息,比如id小的一般是更早創建的。
所以要對id進行混淆,混淆有這么幾個特點:
它是一個無符號整數到字符串的一一對應的函數
雙向的,混淆之后可以恢復,所以不能用hash
不表現出遞增的特征
不用像加密那樣強,也不用有密鑰
沒有整數范圍的限制。這一條是我加的,google能搜到很多id混淆的方法但它們可能要求id在2^32-1之內,比如對2^32求一個multiplicative inverse,這是一個不錯的方法但因為這個限制我沒有采用它。
最簡單的一個方法是找一個比較大的數字進行異或,比如1-10跟1093420374進行異或的結果是這樣的:
1 : 1093420375 2 : 1093420372 3 : 1093420373 4 : 1093420370 5 : 1093420371 6 : 1093420368 7 : 1093420369 8 : 1093420382 9 : 1093420383 10: 1093420380
但這比較容易被人猜出是異或,需要再加上別的操作
我看到的一個比較好的方法也是我目前在用的是:
對id求個hash,取前16字節,作為segment1
對segment1求hash,取前8字節,作為segment2
將segment2轉換為整數,加上id,再變回byte array
將segment1和segment2連接起來再求個hash,取前8字節,作為segment3(用于恢復時的驗證)
連接segment1、2、3,做base64,得到混淆后的id
恢復的時候只用
base64解碼
取前16字節得到segment1,后8字節得到segment3,剩余字節是segment2
驗證hash(segmemt1+segment2)是否等于segment3
int(segment2)-int(hash(segment1))得到id
這用python實現比較方便,因為python的整數可以無限大,代碼是這樣的
pythonclass Obfuscator: _head_bytes = 16 _mid_bytes = 8 _tail_bytes = 8 @staticmethod def bytearray_to_int(byte_arr): return int.from_bytes(byte_arr, byteorder="big") @staticmethod def int_to_bytearray(num): assert isinstance(num, int) and num >= 0 if num == 0: return b"0" result = [] while num > 0: d, m = divmod(num, 256) result.append(m) num = d return bytes(result[::-1]) @classmethod def obfuscate(cls, uid): if not uid: return "" uid_bytes = cls.int_to_bytearray(uid) seg1 = hashlib.sha1(uid_bytes).digest()[:cls._head_bytes] seg2 = hashlib.sha1(seg1).digest()[:cls._mid_bytes] seg2 = cls.int_to_bytearray(uid + cls.bytearray_to_int(seg2)) seg3 = hashlib.sha1(seg1 + seg2).digest()[:cls._tail_bytes] return base64.urlsafe_b64encode(seg1 + seg2 + seg3).decode() @classmethod def restore(cls, obscure_str): if not obscure_str: return -1 seg_bytes = base64.urlsafe_b64decode(obscure_str) seg1 = seg_bytes[:cls._head_bytes] seg2 = seg_bytes[cls._head_bytes:-cls._tail_bytes] seg3 = seg_bytes[-cls._tail_bytes:] if hashlib.sha1(seg1 + seg2).digest()[:cls._tail_bytes] != seg3: return -1 seg1 = hashlib.sha1(seg1).digest()[:cls._mid_bytes] return cls.bytearray_to_int(seg2) - cls.bytearray_to_int(seg1)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45367.html
摘要:我把這個領域的東西寫成了一個系列,以后還會繼續完善下去安全一同源策略與跨域安全二攻擊安全三攻擊 上文說完了CSRF攻擊,本文繼續研究它的兄弟XSS攻擊。 什么是XSS攻擊 XSS攻擊全名(Cross-Site-Script)跨域腳本攻擊,為了跟CSS(Cascading-Style-Sheet)區分開來,所以縮寫是XSS。 XSS攻擊的原理 上一節說道的CSRF攻擊是利用的是偽請求,這...
摘要:我把這個領域的東西寫成了一個系列,以后還會繼續完善下去安全一同源策略與跨域安全二攻擊安全三攻擊 上文說完了CSRF攻擊,本文繼續研究它的兄弟XSS攻擊。 什么是XSS攻擊 XSS攻擊全名(Cross-Site-Script)跨域腳本攻擊,為了跟CSS(Cascading-Style-Sheet)區分開來,所以縮寫是XSS。 XSS攻擊的原理 上一節說道的CSRF攻擊是利用的是偽請求,這...
摘要:騰訊特約作者微信客戶端高級工程師微信中的資源混淆工具主要為了混淆資源長度例如將混淆為,同時利用深度壓縮,大大減少了安裝包體積,同時也增加了逼格,提升了反破解難度。寫在前言資源混淆工具大約是在年月實現,并在微信中使用,減少了大約的空間。 騰訊Bugly特約作者: 微信客戶端高級工程師 shwen 微信中的資源混淆工具主要為了混淆資源ID長度(例如將res/drawable/welcome...
閱讀 3940·2021-10-09 09:43
閱讀 2872·2021-10-08 10:05
閱讀 2734·2021-09-08 10:44
閱讀 883·2019-08-30 15:52
閱讀 2810·2019-08-26 17:01
閱讀 3016·2019-08-26 13:54
閱讀 1651·2019-08-26 10:48
閱讀 807·2019-08-23 14:41