Expérimentez avec les règles de mot de passe NIST 800-63B en Python

Chaque fois que je crée un nouveau compte, je suis souvent dérangé par ce message. hate-tweet-about-password-rules.png Alors, quel genre de personne est un bon mot de passe? À partir de maintenant, je vais essayer les règles de mot de passe NIST apprises à partir de Data Camp en Python. Comme le japonais n'est pas ma langue maternelle, j'utiliserai l'anglais quand c'est difficile à expliquer, alors pardonnez-moi.

The repository is at https://github.com/Bing-Violet/Bad-passwords-and-the-NIST-guidelines with the data sets available.


There're loads of criteria for a good password. It's hard to define what is a good password. However, the National Institute of Standards and Technology (NIST) gives you a guide not to make a bad password from the cyber-security perspective.

# Importing the pandas module
import pandas as pd

# Loading in datasets/users.csv 
users = pd.read_csv("datasets/users.csv")

# Printing out how many users we've got
print(users.count())

# Taking a look at the 12 first users
print(users.head(12))

Passwords should not be too short

# Calculating the lengths of users' passwords
users['length'] = users['password'].str.len()

# Flagging the users with too short passwords
users['too_short'] = users['length'] < 8

# Counting and printing the number of users with too short passwords
print(users['too_short'].count())

# Taking a look at the 12 first rows
print(users.head(12))

Passwords shouldn't be Common passwords

Common passwords and combinations should be avoided as they could be expected. General common passwords include but not restricted to:

# Reading in the top 10000 passwords
common_passwords = pd.read_csv('datasets/10_million_password_list_top_10000.txt', header=None, squeeze=True)

# Taking a look at the top 20
print(common_passwords.head(20))

We fetch the common password list, then find out all the passwords fall in this category.

# Flagging the users with passwords that are common passwords
users['common_password'] = users['password'].isin(common_passwords)

# Counting and printing the number of users using common passwords
print(users['common_password'].count())

# Taking a look at the 12 first rows
print(users['common_password'].head(12))

Passwords should not be common passwords

By the same token, passwords shouldn't be common words. This may not apply to local Japanese people, as the list we fetch here only contains popular English dictionary words.

# Reading in a list of the 10000 most common words
words = pd.read_csv('datasets/google-10000-english.txt', header=None, squeeze=True)

# Flagging the users with passwords that are common words
users['common_word'] = users['password'].str.lower().isin(words)

# Counting and printing the number of users using common words as passwords
print(users['common_word'].count())

# Taking a look at the 12 first rows
print(users['common_word'].head(12))

Passwords should not be your name We should also flag passwords that contain users' names as a bad password practice.

# Extracting first and last names into their own columns
users['first_name'] = users['user_name'].str.extract(r'(\w+)', expand = False)
users['last_name'] = users['user_name'].str.extract(r'(\w+$)', expand = False)

# Flagging the users with passwords that matches their names
users['uses_name'] = (users['password']==(users['first_name']))|(users['password']==(users['last_name']))

# Counting and printing the number of users using names as passwords
print(users['uses_name'].count())

# Taking a look at the 12 first rows
print(users['uses_name'].head(12))

Passwords should not be repetitive

### Flagging the users with passwords with >= 4 repeats
users['too_many_repeats'] = users['password'].str.contains(r'(.)\1\1\1')

# Taking a look at the users with too many repeats
print(users['too_many_repeats'])

All together now! Now let's combine the criteria listed above and filter out all the bad passwords.

# Flagging all passwords that are bad
users['bad_password'] = ( 
    users['too_short'] | 
    users['common_password'] |
    users['common_word'] | 
    users['user_name'] |
    users['too_many_repeats'])

# Counting and printing the number of bad passwords
print((users['bad_password']==True).count())

# Looking at the first 25 bad passwords
print(users['bad_password'].head(25))

This is how we can filter out the bad passwords in a data set. And similar approaches can be adopted for your current database if you already have some users and want to improve the security for their accounts. :champagne:

Recommended Posts

Expérimentez avec les règles de mot de passe NIST 800-63B en Python
Générer un mot de passe pour le manuel avec python
Grattage au sélénium en Python
Grattage avec chromedriver en python
Débogage avec pdb en Python
Gérer les sons en Python
Grattage avec du sélénium en Python
Grattage avec Tor en Python
Tweet avec image en Python
Combiné avec ordinal en Python
Boîte de mot de passe facile en Python
Gestion des mots de passe avec python: trousseau de clés
Authentification de base avec mot de passe crypté (.htpasswd) avec bouteille en python
Reconnaissance des nombres dans les images avec Python
Tester avec des nombres aléatoires en Python
GOTO en Python avec Sublime Text 3
Travailler avec LibreOffice en Python: import
Scraping avec Selenium en Python (Basic)
Analyse CSS avec cssutils en Python
Numer0n avec des objets fabriqués avec Python
Ouvrez UTF-8 avec BOM en Python
Règles d'apprentissage Widrow-Hoff implémentées en Python
Utiliser rospy avec virtualenv dans Python3
Utiliser Python mis en pyenv avec NeoVim
Heatmap avec dendrogramme en Python + matplotlib
[Python] Générer un mot de passe avec Slackbot
Lire des fichiers en parallèle avec Python
Implémentation des règles d'apprentissage Perceptron en Python
Utiliser OpenCV avec Python 3 dans Window
Jusqu'à traiter de python dans Atom
Démarrez avec Python avec Blender
Travailler avec des images DICOM en Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Résoudre ABC175 A, B, C avec Python
Essayez de vous connecter à qiita avec Python
Test de stress avec Locust écrit en Python
Python3> dans le mot clé> Vrai avec une correspondance partielle?
Surveillance des appareils effectuée par Python On-box de IOS-XE
Essayez de travailler avec des données binaires en Python
Dessinez Nozomi Sasaki dans Excel avec python
Conseils pour gérer les binaires en Python
Afficher Python 3 dans le navigateur avec MAMP
Comment utiliser BigQuery en Python
Classe Trump en Python (avec comparaison)
Simplifiez le déverrouillage du mot de passe PDF avec python + bat
Traiter plusieurs listes avec for en Python
Un serveur Web de ligne (avec CGI) en python
Commençons avec TopCoder en Python (version 2020)
Résoudre ABC165 A, B, D avec Python
Appelez sudo en Python et mot de passe à saisie automatique
Traitez facilement des images en Python avec Pillow
Pour faire fonctionner la station d'horodatage en Python
Appelez APIGateWay avec APIKey dans les requêtes python
Analyse résiduelle en Python (Supplément: règles Cochrane)
J'ai créé un outil de mot de passe en Python.
Lire des caractères dans des images avec Python OCR
Introduction de sip-4.14 dans l'environnement python3.2.2 avec MacOS 10.7.4
[Python] Récupérez les fichiers dans le dossier avec Python