【问题标题】:Django Password GeneratorDjango 密码生成器
【发布时间】:2012-03-17 20:21:17
【问题描述】:

我已将一堆用户及其数据导入 django 项目。我需要为每个人分配一个密码。是否有这样一个用于生成密码的 sn-p 来处理 Django 哈希和盐?

【问题讨论】:

  • 它可能已经改变,但您不必“处理 Django 哈希和盐”,因为您可以在处理提供的密码的 User 对象上使用 .set_password() helper function选择密钥派生函数并使用它设置.password 字段/属性。

标签: django passwords


【解决方案1】:
import random
import string 
user.set_password(''.join([random.choice(string.digits + string.letters) for i in range(0, 10)]))
user.save()

【讨论】:

    【解决方案2】:

    只需使用 API - django.contrib.auth.models.User 有一个 .set_password() 方法。这是一个例子(我没有测试过,但你应该明白):

    from random import choice
    from string import digits, letters
    from django.contrib.auth.models import User
    
    def _pw(length=6):
        s = ''
        for i in range(length):
            s += random.choice(digits + letters)
        return s
    
    for user in User.objects.all(): # or .filter(...)
        user.set_password(_pw())
        user.save()
    

    【讨论】:

      【解决方案3】:

      也可以使用内置函数make_random_password

      for user in new_users:
          password = User.objects.make_random_password()
          user.set_password(password)
          user.save(update_fields=['password'])
          # email/print password
      

      【讨论】:

      • 还要注意make_random_password() 接受关键字参数lengthallowed_chars
      • user.save() 应用更改丢失
      【解决方案4】:

      您也可以使用auth 模块之外的from django.utils.crypto import get_random_string,它也接受关键字参数lengthallowed_chars

      【讨论】:

      • +1。优于 User.objects.make_random_password() 因为它可以从独立脚本运行而无需配置 Django 设置。我用它来生成随机夹具。
      • 我更喜欢这个,因为我不需要与任何对象交互来完成它。它使用户更容易执行诸如随机密码生成器之类的操作。对于实例 def get_password_view(request): return JsonResponse({ "password" : get_random_string() })
      • 更喜欢这个,因为User.objects.make_random_password()如果被继承就会报错。
      【解决方案5】:

      如果你只需要一个 Django 的解决方案,那么请尝试下一步:

      要生成普通密码,请尝试使用 BaseUserManager。

      In [341]: from django.contrib.auth.base_user import BaseUserManager
      
      # simple password, it length is 10, and it contains ascii letters and digits
      In [344]: BaseUserManager().make_random_password()
      Out[344]: 'aYMX5Wk7Cu'
      
      In [345]: BaseUserManager().make_random_password()
      Out[345]: 'rM7759hw96'
      
      In [346]: BaseUserManager().make_random_password()
      Out[346]: 'EkbZxEXyAm'
      
      # passed length of a password
      In [347]: BaseUserManager().make_random_password(45)
      Out[347]: 'dtM9vhSBL9WSFeEdPqj8jVPMH9ytsjPXrkaHUNUQu4zVH'
      
      In [348]: BaseUserManager().make_random_password(45)
      Out[348]: 'jypVaXuw9Uw8mD4CXtEhtj2E4DVYx23YTMwy8jGTKsreR'
      
      # passed length of a password and symbols for choice
      In [349]: BaseUserManager().make_random_password(45, 'abcdf')
      Out[349]: 'daacbfabfccfdbdddbbcddcfcfbfcdabbaccbfcadbccd'
      
      In [351]: import string
      
      # password contains only digits
      In [352]: BaseUserManager().make_random_password(50, string.digits)
      Out[352]: '00526693878168774026398080457185060971935025500935'
      
      # password contains only ascii symbols in lowercase
      In [353]: BaseUserManager().make_random_password(50, string.ascii_lowercase)
      Out[353]: 'nvftisuezofnashdhlalfmscnmqtvigwjpfwsyycsefekytmar'
      
      # password contains only ascii symbols in uppercase
      In [354]: BaseUserManager().make_random_password(50, string.ascii_uppercase)
      Out[354]: 'APKSUHHHTAAJCFEUONIXWWAKJGXIBHTQDZBTSYFTPDFOSRYEQR'
      

      如果您需要强大且强大的密码,请尝试 Django 中的内置“哈希器”

      In [355]: from django.contrib.auth.hashers import make_password
      
      In [357]: make_password('')
      Out[357]: 'pbkdf2_sha256$30000$JuKXdW3shCjL$PsPJX7Zale5JUBkWpIJI/+QlsuVWhz9Q+GQWVtTpQ/Y='
      
      In [358]: make_password('text')
      Out[358]: 'pbkdf2_sha256$30000$lSv8kQ39BHE7$KQC5hRhuphYBXmBrXZBJGC+nxygfNWTDf8zQf/NNgY8='
      
      In [360]: make_password('text', salt=['simething'])
      Out[360]: "pbkdf2_sha256$30000$['simething']$D+1vJQx9W2/c9sIz/J+7iEz4d4KFPg/R+0S87n/RKR4="
      
      In [361]: make_password('text', salt=['something'])
      Out[361]: "pbkdf2_sha256$30000$['something']$NIcmOkEyg6mnH5Ljt+KvI2LVgZWg6sXS6Rh865rbhSc="
      

      注意事项:

      1. 使用 Django 1.10 和 Python 3.4

      【讨论】:

        猜你喜欢
        • 2013-10-06
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 2021-07-01
        • 2010-12-02
        • 2016-08-18
        相关资源
        最近更新 更多