最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django密碼存儲策略分析

 更新時間:2020年01月09日 10:39:49   作者:藍綠色~菠菜  
這篇文章主要介紹了Django密碼存儲策略分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、源碼分析

Django 發(fā)布的 1.4 版本中包含了一些安全方面的重要提升。其中一個是使用 PBKDF2 密碼加密算法代替了 SHA1 。另外一個特性是你可以添加自己的密碼加密方法。

Django 會使用你提供的第一個密碼加密方法(在你的 setting.py 文件里要至少有一個方法)

PASSWORD_HASHERS = [
  'django.contrib.auth.hashers.PBKDF2PasswordHasher',
  'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
  'django.contrib.auth.hashers.Argon2PasswordHasher',
  'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
  'django.contrib.auth.hashers.BCryptPasswordHasher',
]

我們先一睹自帶的PBKDF2PasswordHasher加密方式。

class BasePasswordHasher(object):
  """
  Abstract base class for password hashers
  When creating your own hasher, you need to override algorithm,
  verify(), encode() and safe_summary().
  PasswordHasher objects are immutable.
  """
  algorithm = None
  library = None
 
  def _load_library(self):
    if self.library is not None:
      if isinstance(self.library, (tuple, list)):
        name, mod_path = self.library
      else:
        name = mod_path = self.library
      try:
        module = importlib.import_module(mod_path)
      except ImportError:
        raise ValueError("Couldn't load %s password algorithm "
                 "library" % name)
      return module
    raise ValueError("Hasher '%s' doesn't specify a library attribute" %
             self.__class__)
 
  def salt(self):
    """
    Generates a cryptographically secure nonce salt in ascii
    """
    return get_random_string()
 
  def verify(self, password, encoded):
    """
    Checks if the given password is correct
    """
    raise NotImplementedError()
 
  def encode(self, password, salt):
    """
    Creates an encoded database value
    The result is normally formatted as "algorithm$salt$hash" and
    must be fewer than 128 characters.
    """
    raise NotImplementedError()
 
  def safe_summary(self, encoded):
    """
    Returns a summary of safe values
    The result is a dictionary and will be used where the password field
    must be displayed to construct a safe representation of the password.
    """
    raise NotImplementedError()
 
 
class PBKDF2PasswordHasher(BasePasswordHasher):
  """
  Secure password hashing using the PBKDF2 algorithm (recommended)
  Configured to use PBKDF2 + HMAC + SHA256.
  The result is a 64 byte binary string. Iterations may be changed
  safely but you must rename the algorithm if you change SHA256.
  """
  algorithm = "pbkdf2_sha256"
  iterations = 36000
  digest = hashlib.sha256
 
  def encode(self, password, salt, iterations=None):
    assert password is not None
    assert salt and '$' not in salt
    if not iterations:
      iterations = self.iterations
    hash = pbkdf2(password, salt, iterations, digest=self.digest)
    hash = base64.b64encode(hash).decode('ascii').strip()
    return "%s$%d$%s$%s" % (self.algorithm, iterations, salt, hash)
 
  def verify(self, password, encoded):
    algorithm, iterations, salt, hash = encoded.split('$', 3)
    assert algorithm == self.algorithm
    encoded_2 = self.encode(password, salt, int(iterations))
    return constant_time_compare(encoded, encoded_2)
 
  def safe_summary(self, encoded):
    algorithm, iterations, salt, hash = encoded.split('$', 3)
    assert algorithm == self.algorithm
    return OrderedDict([
      (_('algorithm'), algorithm),
      (_('iterations'), iterations),
      (_('salt'), mask_hash(salt)),
      (_('hash'), mask_hash(hash)),
    ])
 
  def must_update(self, encoded):
    algorithm, iterations, salt, hash = encoded.split('$', 3)
    return int(iterations) != self.iterations
 
  def harden_runtime(self, password, encoded):
    algorithm, iterations, salt, hash = encoded.split('$', 3)
    extra_iterations = self.iterations - int(iterations)
    if extra_iterations > 0:
      self.encode(password, salt, extra_iterations)

正如你看到那樣,你必須繼承自BasePasswordHasher,并且重寫 verify() , encode() 以及 safe_summary() 方法。

Django 是使用 PBKDF 2算法與36,000次的迭代使得它不那么容易被暴力破解法輕易攻破。密碼用下面的格式儲存:

algorithm$number of iterations$salt$password hash”

例:pbkdf2_sha256$36000$Lx7auRCc8FUI$eG9lX66cKFTos9sEcihhiSCjI6uqbr9ZrO+Iq3H9xDU=

二、自定義密碼加密方法

1、在settings.py中加入自定義的加密算法:

PASSWORD_HASHERS = [
  'myproject.hashers.MyMD5PasswordHasher', 
  'django.contrib.auth.hashers.PBKDF2PasswordHasher',
  'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
  'django.contrib.auth.hashers.Argon2PasswordHasher',
  'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
  'django.contrib.auth.hashers.BCryptPasswordHasher',
]

2、再來看MyMD5PasswordHasher,這個是我自定義的加密方式,就是基本的md5,而django的MD5PasswordHasher是加鹽的:

 from django.contrib.auth.hashers import BasePasswordHasher,MD5PasswordHasher
 from django.contrib.auth.hashers import mask_hash
 import hashlib
 
 class MyMD5PasswordHasher(MD5PasswordHasher):
   algorithm = "mymd5"
 
   def encode(self, password, salt):
     assert password is not None
     hash = hashlib.md5(password).hexdigest().upper()
     return hash
 
   def verify(self, password, encoded):
     encoded_2 = self.encode(password, '')
     return encoded.upper() == encoded_2.upper()
 
   def safe_summary(self, encoded):
     return OrderedDict([
         (_('algorithm'), algorithm),
         (_('salt'), ''),
         (_('hash'), mask_hash(hash)),
         ])

之后可以在數(shù)據(jù)庫中看到,密碼確實使用了自定義的加密方式。

3、修改認證方式

AUTHENTICATION_BACKENDS = (
  'framework.mybackend.MyBackend', #新加
  'django.contrib.auth.backends.ModelBackend',
  'guardian.backends.ObjectPermissionBackend',
)

4、再來看自定義的認證方式

framework.mybackend.py:

 import hashlib
 from pro import models
 from django.contrib.auth.backends import ModelBackend
 
 class MyBackend(ModelBackend):
   def authenticate(self, username=None, password=None):
     try:
       user = models.M_User.objects.get(username=username)
       print user
     except Exception:
       print 'no user'
       return None
     if hashlib.md5(password).hexdigest().upper() == user.password:
       return user
     return None
 
   def get_user(self, user_id):
     try:
       return models.M_User.objects.get(id=user_id)
     except Exception:
       return None

當然經(jīng)過這些修改后最終的安全性比起django自帶的降低很多,但是需求就是這樣的,必須滿足。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 十分鐘利用Python制作屬于你自己的個性logo

    十分鐘利用Python制作屬于你自己的個性logo

    這篇文章主要給大家介紹了關于十分鐘如何利用Python制作屬于你自己的個性logo的相關資料,主要利用的是詞云實現(xiàn)這個效果,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面來一起看看吧
    2018-05-05
  • 使用pandas中的DataFrame.rolling方法查看時間序列中的異常值

    使用pandas中的DataFrame.rolling方法查看時間序列中的異常值

    Pandas是Python中最受歡迎的數(shù)據(jù)分析和處理庫之一,提供了許多強大且靈活的數(shù)據(jù)操作工具,在Pandas中,DataFrame.rolling方法是一個強大的工具,在本文中,我們將深入探討DataFrame.rolling方法的各種參數(shù)和示例,以幫助您更好地理解和應用這個功能
    2023-12-12
  • Python中的yield淺析

    Python中的yield淺析

    這篇文章主要介紹了Python中的yield淺析,對迭代器(iterator) 、生成器(constructor)一并做了分析,并用實例來說明,需要的朋友可以參考下
    2014-06-06
  • python3中sys.argv的實例用法

    python3中sys.argv的實例用法

    在本篇文章里小編給大家分享的是關于python3中sys.argv的實例用法內(nèi)容,需要的朋友們可以學習下。
    2020-04-04
  • Python內(nèi)置模塊UUID的具體使用

    Python內(nèi)置模塊UUID的具體使用

    Python標準庫中的uuid模塊提供生成UUID的多種方法實現(xiàn),本文就來介紹一下Python內(nèi)置模塊UUID的具體使用,感興趣的可以了解一下
    2024-12-12
  • 編寫python程序的90條建議

    編寫python程序的90條建議

    自己寫 Python 也有四五年了,一直是用自己的“強迫癥”在維持自己代碼的質(zhì)量。都有去看 Google 的 Python 代碼規(guī)范,對這幾年的工作經(jīng)驗,做個簡單的筆記,如果你也在學 Python,準備要學習 Python,希望這篇文章對你有用。
    2021-04-04
  • 在Python下嘗試多線程編程

    在Python下嘗試多線程編程

    這篇文章主要介紹了在Python下多線程編程的嘗試,由于GIL的存在,多線程在Python開發(fā)領域一直是個熱門問題,需要的朋友可以參考下
    2015-04-04
  • 手把手教你實現(xiàn)Python重試超時裝飾器

    手把手教你實現(xiàn)Python重試超時裝飾器

    這篇文章主要為大家介紹了實現(xiàn)Python重試超時裝飾器教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2023-05-05
  • python實現(xiàn)將excel文件轉化成CSV格式

    python實現(xiàn)將excel文件轉化成CSV格式

    下面小編就為大家分享一篇python實現(xiàn)將excel文件轉化成CSV格式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • python之pexpect實現(xiàn)自動交互的例子

    python之pexpect實現(xiàn)自動交互的例子

    今天小編就為大家分享一篇python之pexpect實現(xiàn)自動交互的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論

清丰县| 卫辉市| 隆子县| 普洱| 专栏| 宜黄县| 西充县| 兰溪市| 顺平县| 红原县| 雷山县| 临清市| 西安市| 靖安县| 塔城市| 泗阳县| 比如县| 五台县| 江永县| 西林县| 夏河县| 天门市| 龙口市| 政和县| 赫章县| 安化县| 攀枝花市| 黔东| 武清区| 西城区| 盐城市| 林口县| 平顶山市| 博罗县| 东兴市| 榕江县| 浦江县| 安西县| 吴旗县| 桦甸市| 大厂|