Q&A
実現したいこと
Windowsで動くPythonで平文のパスワードと暗号化されたパスワードの照合を行いたいです。
cryptモジュールを使わないパスワードの照合する方法を教えてください!
前提
PHPで動いでいるWebアプリにて、次のようなコードでパスワードをハッシュ化してDBに保存・照合を行っています。
php
1 public function get_hashed_password($password) 2 { 3 // コストパラメーター 4 // 04 から 31 までの範囲 大きくなれば堅牢になりますが、システムに負荷がかかります。 5 $cost = 10; 6 7 // ランダムな文字列を生成します。 8 $salt = strtr(base64_encode(random_bytes(16)), '+', '.'); 9 10 // ソルトを生成します。 11 $salt = sprintf("$2y$%02d$", $cost) . $salt; 12 13 $hash = crypt($password, $salt); 14 15 return $hash; 16 } 17 18 19 // パスワードが一致したらtrueを返します 20 public function check_password($password, $hashed_password) 21 { 22 if (hash_equals($hashed_password, crypt($password, $hashed_password))) { 23 return true; 24 } 25}
今回、登録されたユーザデータを用いて、Kivyのスマホアプリでもログイン機能を実装しようと思い、
いろいろ試してみました。
認証の流れ
1.usernameとパスワードを入力してもらう
2.usernameに登録された、暗号化されたパスワードを自作WebAPIから入手する
3.暗号化されたパスワードと入力された平文のパスワードを照合する
しかし、3.の手順で必要なcryptモジュールがWindowsでは使用できないようです。
該当のソースコード
python
1import hmac 2import crypt 3#省略 4 5 def check(self): 6 username = self.ids['username'] #usernameWidget 7 password = self.ids['password'] #passwordWidget 8 if username.text != '' and password.text != '': 9 url = "http://192.168.11.69/api/get_id_password.php"+'?username='+username.text 10 json_data = requests.get(url) #ユーザネームから暗号化されたパスワードの入手 11 #ここで照合 12 if( hmac.compare_digest(crypt.crypt(password.text,json_data.json()['password']), json_data.json()['password']) ): 13 self.ids['error'].text = json_data.json()['password'] 14 else: 15 self.ids['error'].text = ('メールアドレスまたは、パスワードが間違っています.') 16 else: 17 self.ids['error'].text = ('メールアドレスまたは、パスワードが入力されていません.')
発生している問題・エラーメッセージ
ImportError: The crypt module is not supported on Windows
補足情報(FW/ツールのバージョンなど)
Python 3.10.9
Kivy (バージョン不明)
回答1件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/02/01 10:21
2023/02/01 10:26