2012-03-21 3 views
1

У меня есть функция в моих view.py, где в некоторой строке я делаю запрос GET идентификатора. Как только я получу идентификатор, я хочу зашифровать этот идентификатор, а затем позже расшифровать его. Поэтому мне нужно две функцииОсновная функция encrypt() и decrypt()

def encrypt(id):#let say the id is 100 
    #do something 
    return encrypted_id # 6-digit let say 985634 

def decrypt(encrypted_id): # Here enter 985634 
    #do something  
    return decrypted_id # i should get 100 

Я прочитал много постов, но не находя простой и чистый способ применить это в моем views.py Вот что я изучал

sha1 : You can't decrypt that (implemented for encryption) Mee 2 M2 . AES it deals with 16-digit that multiple of 8 something

Я пытался генерировать 6-значное случайное число, но эта идея также не является многообещающей. Может ли кто-нибудь сказать способ, как это сделать? Заранее спасибо

+0

некоторые действительно хорошие идеи здесь: http://stackoverflow.com/questions/8554286/obfuscating-an-id – georg

ответ

15

Используйте AES (от pycrypto), но проложите обычный текст перед его зашифровкой.

Этот пример подушечки четкий текст с нулевыми символами (ASCII 0)

from Crypto.Cipher import AES 
import base64 

MASTER_KEY="Some-long-base-key-to-use-as-encyrption-key" 

def encrypt_val(clear_text): 
    enc_secret = AES.new(MASTER_KEY[:32]) 
    tag_string = (str(clear_text) + 
        (AES.block_size - 
        len(str(clear_text)) % AES.block_size) * "\0") 
    cipher_text = base64.b64encode(enc_secret.encrypt(tag_string)) 

    return cipher_text 

После расшифровки, раздеть нулевые символы:

def decrypt_val(cipher_text): 
    dec_secret = AES.new(MASTER_KEY[:32]) 
    raw_decrypted = dec_secret.decrypt(base64.b64decode(cipher_text)) 
    clear_val = raw_decrypted.rstrip("\0") 
    return clear_val 
+0

Почему отступы? – bos

+0

Поскольку алгоритм AES работает с блоками, кратными 16 байтам (AES.block_size = 16). –

+0

Идеальный ответ Дуга. Есть ли способ избежать или построить некоторую логику, где я могу использовать свой идентификатор, который будет поступать из запроса в функцию просмотра django, а затем он будет соответствовать размеру блока. Я хочу, чтобы избежать жесткого кодирования главного ключа, мы можем сделать его динамическим. Я новичок в шифровании. Но спасибо за вашу помощь. Отличный ответ !!!!! –

4

У меня была точно такая же проблема, и решить ее используя Hashids.

Это так просто, как

hashids = Hashids(salt="this is my salt") 
hashed = hashids.encode(id) # to encode 
id = hashids.decode(hashed) # to decode 
+1

Hashids - это только значения хеш-целых чисел, которые я думаю .. ?? – amulya349