質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.59%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

696閲覧

【Kivy】ハッシュ化されたパスワードを用いたパスワードの照合方法

saitou_san

総合スコア27

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/02/01 07:06

実現したいこと

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 (バージョン不明)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

guest

回答1

2

ベストアンサー

crypt --- Unix パスワードをチェックするための関数

バージョン 3.11 で非推奨、バージョン 3.13 で削除予定: The crypt module is deprecated (see PEP 594 for details and alternatives). The hashlib module is a potential replacement for certain use cases.

とのことで、いずれ削除される予定ですしhashlibを使うとよいかと思います。

投稿2023/02/01 07:34

can110

総合スコア38156

ockeghem, saitou_san👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

saitou_san

2023/02/01 10:21

hashlibで照合に成功しました。ありがとうございます。 追加で質問なんですが、 from passlib.context import CryptContext pwt_context = CryptContext(schemes=["bcrypt"], deprecated="auto") #省略 if pwt_context.verify(input_password, hashed_password): #省略 で照合した場合、タイミング攻撃対策はできているのでしょうか?
can110

2023/02/01 10:26

セキュリティについては疎いので分かりません。 その疑問について新たに質問を立てることをおすすめします。 適切な回答が得られると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.59%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。