Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでUNIXパスワードを検証する関数の実装方法

UNIXのパスワードを検証するには、Python標準ライブラリの crypt モジュールを使用します。このモジュールにはUNIX標準の crypt(3) ルーチンが実装されており、その内部では、DESアルゴリズムを改造した一方向ハッシュ関数が利用されています。

crypt モジュールを使用するには、まず次のようにインポートします。

import crypt

crypt.crypt(word, salt) メソッド

このメソッドは2つの引数を受け取ります。第1引数の word はユーザーが入力した平文パスワード、第2引数の salt はランダムな文字列です。

saltは、DESアルゴリズムの動作を4096通りのうちのいずれかの方式で変化(摂動)させるために使われます。saltに含められるのは英大文字・英小文字・数字および「/」「.」の文字のみです。

このメソッドは、ハッシュ化されたパスワードを文字列として返します。

サンプルコード

以下は、入力されたユーザー名とパスワードが一致するかどうかをチェックするサンプルです。spwd モジュールでシャドウパスワードを取得し、getpass モジュールを使ってパスワードを画面に表示せずに入力しています。

import crypt, getpass, spwd

def check_pass():
    username = input("Enter The Username: ")
    password = spwd.getspnam(username).sp_pwdp
    if password:
        clr_text = getpass.getpass()
        return crypt.crypt(clr_text, password) == password
    else:
        return 1

if check_pass():
    print("The password matched")
else:
    print("The password does not match")

実行結果

※ シャドウパスワードファイルを読み取るため、このプログラムはroot権限で実行する必要があります。

$ sudo python3 example.py
Enter The Username: unix_user
Password:
The password matched
  1. Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説

    本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値

  2. Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法

    この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print