django, Python и шифрование ссылки

Я должен расположить некоторый encrpytion для генерации пользователя определенные ссылки. Пользователи будут нажимать на эту ссылку и при некотором другом представлении, ссылка по теме со строкой crypted будет дешифрована, и результат будет возвращен.

Для этого мне нужна некоторая функция шифрования, которая использует число (или строка), который является первичным ключом моего выбранного пункта, который связывается с учетной записью пользователя, также используя некоторое семя и генерируя код шифрования, который будет дешифрован на уровне некоторой другой страницы.

так что-то вроде этого

my_items_pk = 36 #primary key of an item
seed = "rsdjk324j23423j4j2" #some string for crypting
encrypted_string = encrypt(my_items_pk,seed)
#generates some crypted string such as "dsaj2j213jasas452k41k"
and at another page:
decrypt_input = encrypt(decypt,seed)
print decrypt_input
#gives 36

Я хочу, чтобы мое "семя" было некоторой основной переменной (не некоторый класс) с этой целью (т.е. некоторое число или строка).

Как я могу достигнуть этого в соответствии с Python и django?

5
задан Ned Batchelder 12 July 2010 в 21:00
поделиться

1 ответ

Добавляю приведенный ниже фрагмент кода в том виде, в котором требуется индикатор активности на панели навигации.

activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
[self navigationItem].rightBarButtonItem = barButton;
[activityIndicator startAnimating];
-121--1136926-

Я не уверен, что вы пытаетесь сделать. Но вот несколько примеров.

Предположим, что у меня есть следующий диапазон:

Excel.Worksheet sheet = this.Application.ActiveSheet as Excel.Worksheet;
Excel.Range range = sheet.get_Range("A1", "B5") as Excel.Range;

Для перемещения диапазона вниз на n - число строк:

int n = 1;
int rows = range.Rows.Count;
int cols = range.Columns.Count;

Excel.Range newRange = range.get_Offset(n, 0).get_Resize(rows-n,cols);
newRange.Select(); //will select the new range will be 1 row lower

Для перемещения нижнего ряда вверх

Excel.Range newRange = range.get_Resize(rows-n,cols);
newRange.Select(); //will select the new range will be 1 row higher

Я предполагаю, что вы можете выяснить, как переместить его в сторону.

get _ смещение () переместит весь диапазон, после чего потребуется изменить его размер.

EDIT: Теперь я знаю, чего вы хотите.

Выбор последней ячейки:

Excel.Range lastCell = range.Cells[rows, cols] as Excel.Range;
lastCell.Select();

Теперь можно использовать собственную начальную точку, например:

Excel.Range newRange = sheet.get_Range("B1", lastCell);
newRange.Select();
-121--4268313-

Нет алгоритмов шифрования, встроенных в Python. Однако, возможно, вам потребуется просмотреть Python Cryptography Toolkit (PyCrypt). Я только обдумал его, но он упоминается в документации Python по криптографическим службам . Вот пример того, как можно зашифровать последовательность с помощью AES с помощью PyCrypt:

from Crypto.Cipher import AES
from urllib import quote

# Note that for AES the key length must be either 16, 24, or 32 bytes
encryption_obj = AES.new('abcdefghijklmnop')
plain = "Testing"

# The plaintext must be a multiple of 16 bytes (for AES), so here we pad it
# with spaces if necessary.
mismatch = len(plain) % 16
if mismatch != 0:
  padding = (16 - mismatch) * ' '
  plain += padding

ciph = encryption_obj.encrypt(plain)

# Finally, to make the encrypted string safe to use in a URL we quote it
quoted_ciph = quote(ciph)

Затем вы сделаете эту часть вашего URL, возможно, как часть запроса GET.

Чтобы расшифровать, просто отмените процесс; предполагая, что encryption _ obj создан, как описано выше, и что вы получили соответствующую часть URL-адреса, это будет сделано:

from urllib import unquote

# We've already created encryption_object as shown above

ciph = unquote(quoted_ciph)
plain = encryption_obj.decrypt(ciph)

Вы также можете рассмотреть другой подход: один простой метод будет хэшировать первичный ключ (с помощью соли, если вы хотите) и хранить хэш и pk в вашей базе данных. Предоставьте пользователю хэш как часть его ссылки, а когда они вернутся и представят хэш, найдите соответствующий pk и верните соответствующий объект. (Если вы хотите пройти по этому маршруту, проверьте встроенную библиотеку hashlib .)

В качестве примера, у вас было бы что-то подобное, определенное в models.py:

class Pk_lookup(models.Model):
  # since we're using sha256, set the max_length of this field to 32
  hashed_pk = models.CharField(primary_key=True, max_length=32)
  key = models.IntegerField()

И вы бы создали хэш в представлении, используя что-то вроде следующего:

import hashlib
import Pk_lookup

hash = hashlib.sha256()
hash.update(str(pk)) # pk has been defined previously
pk_digest = hash.digest()

lookup = Pk_lookup(hashed_pk=pk_digest,key=pk)
lookup.save()

Обратите внимание, что вы также должны цитировать эту версию; если вы предпочитаете, вы можете использовать hexdigest () вместо digest (вам не придется цитировать результирующий ряд), но вам придется скорректировать длину поля, чтобы 64.

8
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: