5

データベース内の各ユーザー オブジェクトには、増分 ID (1、2、3、...) があります。ユーザーのプロファイルを表示する URL には、ユーザー オブジェクトの ID が含まれています。例: http://www.example.com/users/1。このようにして、誰もがウェブサイトに何人のユーザーがいるか、ユーザーベースがどれだけ速く成長しているかなどを知ることができます.私はその情報を教えたくありません.

増分 ID を Base58 形式の固定長文字列に変換したいので、URL はhttp://www.example.com/users/2WNrx2jq184のようになります。オリジナルID。リバース関数は、リバース エンジニアリングが容易であってはなりません。

この目的に最適な Python コードはhttps://github.com/JordanReiter/django-id-obfuscatorです。これは非常に優れていますが、場合によっては0and/or.文字が追加され、Base58 ではなく、固定長でない文字列になります。( utils.pyの 24 行目と 29 行目を参照してください。)

django-id-obfuscator を改善して固定長の base58 難読化 ID にする方法、または Python でそのような難読化 ID を作成する方法を教えてください。

4

2 に答える 2

6

これを適切に行いたい場合は、ユーザー ID を取得し、先頭にゼロを埋め込んでから、AES などで暗号化し、結果を base58 でエンコードします。ID を取り戻すには、デコード、復号化、およびint()その結果を取得するだけです。

暗号化の場合:

>>> from Crypto.Cipher import AES
>>> import base64
>>> obj = AES.new('yoursecretkeyABC')
>>> x = base64.encodestring(obj.encrypt("%016d"%1))
>>> x
'tXDxMg1YGb1i0V29yCCBWg==\n'

と復号化

>>> int(obj.decrypt(base64.decodestring(x)))
1

弱い暗号で生活できる場合は、パディングされた ID をキーで単純に xor することもできます。

>>> key = [33, 53, 2, 42]
>>> id = "%04d" % 1
>>> x = ''.join([chr(a^ord(b)) for a, b in zip(key, id)])
>>> x
'\x11\x052\x1b'
>>> int(''.join([chr(a^ord(b)) for a, b in zip(key, x)]))
1

ただし、複数のメッセージに同じ OTP を使用してはならないため、これは安全性がはるかに低くなります。また、キーがパディングされた ID と同じ長さであることを確認してください。

于 2012-06-15T09:44:11.053 に答える