ホームページ > データベース > mysql チュートリアル > 一意の整数識別子を使用して Django の主キーを安全に難読化するにはどうすればよいですか?

一意の整数識別子を使用して Django の主キーを安全に難読化するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-24 17:13:12
オリジナル
251 人が閲覧しました

How Can I Securely Obfuscate Django's Primary Key Using Unique Integer Identifiers?

一意の整数識別子による Django の主キーの隠蔽

Django では、主キーは通常、一意のキーとして機能する自動インクリメントされる整数です。テーブル内の各行の識別子。ただし、このキーを URL またはその他の公開コンテキストで公開すると、プライバシーとセキュリティが侵害される可能性があります。この記事では、主キーの一意の性質を維持しながら主キーを難読化する別のアプローチについて説明します。

要件

  • 主キーのフィールド タイプは整数のままである必要があります。
  • 実行中はハッシュ/アンハッシュ操作は行われません読み取り/書き込み/比較。
  • 不可逆ハッシュ/暗号化関数。
  • 各テーブル内の一意の値のみ。
  • 短縮された簡潔なハッシュ値URL.

アプローチ

これらの要件に対処するために、Instagram の ID 生成システムと同様のソリューションが提案されています。このアプローチには、時間ベースのコンポーネントとランダムなコンポーネントで構成される一意の ID を生成することが含まれます。

ID 生成関数

import time
import random

START_TIME = int(time.time() * 1000)  # Some constant timestamp

def make_id():

    t = int(time.time() * 1000) - START_TIME
    u = random.SystemRandom().getrandbits(23)
    id = (t << 23) | u

    return id

def reverse_id(id):

    t = id >> 23
    return t + START_TIME
ログイン後にコピー

make_id 関数は、次を使用して一意の ID を生成します。 41 ビットの時間ベースのコンポーネントと 23 ビットのランダム コンポーネントです。 reverse_id 関数を使用すると、生成された ID からタイムスタンプを抽出できます。

モデル

from django.db import models

class MyClass(models.Model):

    id = models.BigIntegerField(default=make_id, primary_key=True)
ログイン後にコピー

make_id 関数を id フィールドのデフォルト値として使用することで、新しいレコードには挿入時に一意の ID が割り当てられます。このアプローチにより、主キー フィールドの整数データ型が維持されると同時に、その連続的な性質がわかりにくくなります。さらに、ID のランダム コンポーネントにより、同時挿入中であっても衝突が防止されます。

使用法

この実装では、主キーの値は簡潔でユニークな整数になります。主キーの機能を維持しながら、暴露に耐性があります。

以上が一意の整数識別子を使用して Django の主キーを安全に難読化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート