亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

混淆id的一種方法

zengdongbao / 1555人閱讀

摘要:這一條是我加的,能搜到很多混淆的方法但它們可能要求在之內(nèi),比如對(duì)求一個(gè),這是一個(gè)不錯(cuò)的方法但因?yàn)檫@個(gè)限制我沒(méi)有采用它。

眾所周知,在web應(yīng)用的API中,總是會(huì)出現(xiàn)數(shù)據(jù)庫(kù)item的id。比如GET /posts/1表示獲取id為1的文章內(nèi)容。這樣做十分簡(jiǎn)潔,但存在被人爬數(shù)據(jù)的風(fēng)險(xiǎn)。比如我可以大致猜測(cè)或者試一下id的范圍,1,2,3...10000這樣迭代地爬數(shù)據(jù)。如果服務(wù)器不做訪問(wèn)限制,很輕易就能把所有數(shù)據(jù)就能爬下來(lái)。而且,這樣的數(shù)字id也會(huì)暴露一些信息,比如id小的一般是更早創(chuàng)建的。

所以要對(duì)id進(jìn)行混淆,混淆有這么幾個(gè)特點(diǎn):

它是一個(gè)無(wú)符號(hào)整數(shù)到字符串的一一對(duì)應(yīng)的函數(shù)

雙向的,混淆之后可以恢復(fù),所以不能用hash

不表現(xiàn)出遞增的特征

不用像加密那樣強(qiáng),也不用有密鑰

沒(méi)有整數(shù)范圍的限制。這一條是我加的,google能搜到很多id混淆的方法但它們可能要求id在2^32-1之內(nèi),比如對(duì)2^32求一個(gè)multiplicative inverse,這是一個(gè)不錯(cuò)的方法但因?yàn)檫@個(gè)限制我沒(méi)有采用它。

最簡(jiǎn)單的一個(gè)方法是找一個(gè)比較大的數(shù)字進(jìn)行異或,比如1-10跟1093420374進(jìn)行異或的結(jié)果是這樣的:

1 : 1093420375
2 : 1093420372
3 : 1093420373
4 : 1093420370
5 : 1093420371
6 : 1093420368
7 : 1093420369
8 : 1093420382
9 : 1093420383
10: 1093420380

但這比較容易被人猜出是異或,需要再加上別的操作

我看到的一個(gè)比較好的方法也是我目前在用的是:

對(duì)id求個(gè)hash,取前16字節(jié),作為segment1

對(duì)segment1求hash,取前8字節(jié),作為segment2

將segment2轉(zhuǎn)換為整數(shù),加上id,再變回byte array

將segment1和segment2連接起來(lái)再求個(gè)hash,取前8字節(jié),作為segment3(用于恢復(fù)時(shí)的驗(yàn)證)

連接segment1、2、3,做base64,得到混淆后的id

恢復(fù)的時(shí)候只用

base64解碼

取前16字節(jié)得到segment1,后8字節(jié)得到segment3,剩余字節(jié)是segment2

驗(yàn)證hash(segmemt1+segment2)是否等于segment3

int(segment2)-int(hash(segment1))得到id

這用python實(shí)現(xiàn)比較方便,因?yàn)閜ython的整數(shù)可以無(wú)限大,代碼是這樣的

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)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/45367.html

相關(guān)文章

  • web安全三,XSS攻擊

    摘要:我把這個(gè)領(lǐng)域的東西寫成了一個(gè)系列,以后還會(huì)繼續(xù)完善下去安全一同源策略與跨域安全二攻擊安全三攻擊 上文說(shuō)完了CSRF攻擊,本文繼續(xù)研究它的兄弟XSS攻擊。 什么是XSS攻擊 XSS攻擊全名(Cross-Site-Script)跨域腳本攻擊,為了跟CSS(Cascading-Style-Sheet)區(qū)分開來(lái),所以縮寫是XSS。 XSS攻擊的原理 上一節(jié)說(shuō)道的CSRF攻擊是利用的是偽請(qǐng)求,這...

    jlanglang 評(píng)論0 收藏0
  • web安全三,XSS攻擊

    摘要:我把這個(gè)領(lǐng)域的東西寫成了一個(gè)系列,以后還會(huì)繼續(xù)完善下去安全一同源策略與跨域安全二攻擊安全三攻擊 上文說(shuō)完了CSRF攻擊,本文繼續(xù)研究它的兄弟XSS攻擊。 什么是XSS攻擊 XSS攻擊全名(Cross-Site-Script)跨域腳本攻擊,為了跟CSS(Cascading-Style-Sheet)區(qū)分開來(lái),所以縮寫是XSS。 XSS攻擊的原理 上一節(jié)說(shuō)道的CSRF攻擊是利用的是偽請(qǐng)求,這...

    JiaXinYi 評(píng)論0 收藏0
  • 微信Android資源混淆打包工具,如何讓應(yīng)用安裝包立減1M

    摘要:騰訊特約作者微信客戶端高級(jí)工程師微信中的資源混淆工具主要為了混淆資源長(zhǎng)度例如將混淆為,同時(shí)利用深度壓縮,大大減少了安裝包體積,同時(shí)也增加了逼格,提升了反破解難度。寫在前言資源混淆工具大約是在年月實(shí)現(xiàn),并在微信中使用,減少了大約的空間。 騰訊Bugly特約作者: 微信客戶端高級(jí)工程師 shwen 微信中的資源混淆工具主要為了混淆資源ID長(zhǎng)度(例如將res/drawable/welcome...

    Honwhy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<