10

私は初心者なので、この質問がばかげているように聞こえる場合は、ご容赦ください。

Python でユーザー名/パスワード チェック用のコードを作成するときに、それが exeie script stateにコンパイルされていない場合、人々はファイルを簡単に開いて、パスワード チェックを実行しているコード部分を削除しないでしょうか?

私は、プログラム全体が完全にpython, noCまたはC++.

このようなプログラムを使用しても、py2exe簡単に逆コンパイルしてソース コードに戻すことができます。では、パスワードチェックをしても無駄ということでしょうか?

プロのプログラマーはどのように対処していますか?

4

8 に答える 8

7

編集: あなたの修正された質問は、パスワード チェックをバイパスするためにコードを編集している人々について懸念していることを明確にしています。はい、その可能性は十分にあります。コードを .pyc 形式で提供することはできますが、誰かがコードを逆コンパイルして変更することを必ずしも防げるとは限りません。残念ながら、Python はコードの変更を防ぐようには設計されていません。あなたができる最善の方法は、安全なサーバーである種の認証トランザクションを実行することです。これにより、誰かがコードをどのように変更しても、そのステップをバイパスできなくなります。正確なアプリケーションによっては、やり過ぎかもしれません。


パスワード認証をどのように管理するかという問題は、人々がキャリア全体を費やすトリッキーなセキュリティ問題です。ただし、独自のパスワード認証を最初からロールしようとしていると仮定して、それに関する情報を次に示します。

カジュアルなパスワード保護でも、原則として、ユーザーのパスワードはプレーンテキスト形式で保存されません。代わりに、通常、信頼できる一方向ハッシュ関数を使用して、パスワードに似ていないビット パターンを作成します。パスワードが入力されると、同じハッシュ関数が適用され、ビット パターンが比較されます。それらが同じである場合、パスワードが正しく入力された可能性が非常に高くなります。

「信頼できる」ハッシュ関数を構成するものは注意が必要です。いくつかは一般的に使用されており、一般的なハッシュ関数の一部は既知のエクスプロイトの影響を受けやすくなっています。

Noelkd は、このアプローチを示すコードをいくつか提供していますが、彼のコードが使用している MD5 は (私が信じている) より良い選択肢があるという程度まで侵害されたものです。この記事では、同様のことを行うコードもいくつか提供しています。

Python でのユーザーとパスワードの認証

SQLite データベースに渡さなければならない実際のパスワードを平文で保存することに関心がある場合、それは別の問題です。ほとんどの場合、このようなパスワードがスクリプトまたは構成ファイルにプレーンテキストで保存されているのを見てきました。アプリケーションは、そのパスワードが危険にさらされるような構造になっています。

于 2013-09-02T09:56:28.137 に答える
4

ユーザーのマシンでチェックを行っている場合、あなたが何をしようとも、彼らは好きなようにコードを編集できます。このようなセキュリティが必要な場合は、サーバーなど、アクセスできない場所でコードを実行する必要があります。「クライアントを信用しない」は、重要なコンピューター セキュリティの原則です。

あなたがやりたいことは、クライアント プログラムによって与えられたパスワードによってのみアクセスできるサーバー スクリプトを作成することだと思います。このサーバー プログラムは、他の回答で示されているコード例と非常によく似た機能を果たします。新しいクライアントが作成されると、平文のパスワードがサーバーに送信され、一方向の暗号化が行われて保存されます。次に、クライアントがプログラムの本体であるコードを使用したい場合、パスワードを送信します。サーバーはこれを一方向の暗号化にかけ、保存されたハッシュ化されたパスワードと一致するかどうかを確認します。存在する場合は、プログラム本体のコードを実行し、結果をユーザーに返します。

関連するトピックについては、他の回答でmd5アルゴリズムの使用が提案されています。ただし、これは最も安全なアルゴリズムではありません。多くの目的で十分に安全hashlibですが、標準ライブラリのモジュールは他のより安全なアルゴリズムを提供しており、代わりにこれらを使用しない理由はありません。

于 2013-09-02T10:27:00.187 に答える
2

サーバー上では、サーバー管理者のみがコードを変更する権限を持つ必要があります。したがって、コードを変更するには、管理者アクセス権が必要です。管理者アクセス権があれば、とにかくすべてにアクセスできます。:-)

同じことがクライアント プログラムにも当てはまります。唯一のセキュリティがパスワード チェックである場合、パスワード チェックを回避する必要はありません。データ ファイルを直接読み取ることができます。

どちらの場合も、ファイルにアクセスできる人がそれらのファイルを読み取れないようにするには、パスワード チェックだけでは十分ではありません。データを暗号化する必要があります。

于 2013-09-02T10:33:05.467 に答える
1

今から基本から始めましょうか。ログイン資格情報パスワードの暗号化を行うときは、常に一方向の暗号化を行う必要があります。一方向暗号化とは、一度暗号化されたテキストを復号化できないことを意味します。一方向のみの暗号化と呼ばれる暗号化がmd5あります。

と呼ばれるPythonで利用可能なライブラリがすでにありますhashlib

Python ドキュメントから:

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("Nobody inspects")
>>> m.update(" the spammish repetition")
>>> m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64

詳細: http://docs.python.org/2/library/hashlib.html?highlight=hashlib#hashlib

于 2013-09-02T09:58:24.273 に答える
0

クライアント マシンに保存されているデータを保護するには、データを暗号化する必要があります。限目。

承認されたユーザーを信頼する場合は、パスワードベースの暗号化キーを使用でき (Stack Exchange に関する他の多くの回答がこれに対処しています)、彼が自分のコンピューターをマルウェアから保護するのに十分なほど賢いことを願っています。

許可されたユーザー (別名 DRM) を信頼していない場合は、運が悪いだけです。別のプロジェクトを見つけてください。;-)

于 2013-09-26T18:19:53.480 に答える
0

1 つの方法は、任意のアルゴリズムのハッシュ形式でパスワードを保存し、指定されたパスワードのハッシュが保存されたパスワード ハッシュと等しいかどうかを確認することです。

2 番目の方法は、"cat" のようなパスワードを取得して ascii に変換し、それらを加算して合計を保存することです。次に、指定されたパスワードの ascii 合計を保存したものと比較できます。

または、両方を組み合わせることができます。また、アスキーサムをハッシュし、指定されたパスワードのアスキーサンのハッシュを比較することもできます。

以上が、少なくとも私が知っている3つの方法です。また、Python で chr または ord デフォルト関数を使用して、ascii に繰り返し変換したり戻したりすることができます。また、hashlib を使用してハッシュすることもできます。

于 2020-06-25T06:18:22.397 に答える
-1

私はここ数日、これを改良し、パスワード クラッカーを使って実行してきましたが、かなり強力に持ちこたえているようです。

これが私のコードです。

import time
import os
import random
import string

passwordScore = 0

def optionOne():
    global passwordScore
    #Code for checking a password
    os.system('cls')
    print('Option One has been selected')
    password = input('Please type in your password here: ')

    #Password check begins
    if (len(password) > 7) and (password.isspace() == False):
        #Check for capitalisation
        for p in password:
            if p.isupper() == True:
                passwordScore += 1
            else:
                pass

        passwordScore += 2
        for s in string.punctuation:
            #Beginning test for special letters
            for p in password:
                if s == p:
                    passwordScore += 1
                else:
                    pass
    else:
        pass

    # Returning results to the user
    if passwordScore >= 5:
        print('Your password is safe enough to use')
        time.sleep(2)
    elif passwordScore == 3:
        print('We believe your password could be safer')
        time.sleep(2)
    else:
        print('Your password is not safe enough to use')
        print('using this password may place your data at risk')
        time.sleep(2)


def optionTwo():
    #Code for creating a password at random
    print('Option Two has been selected')
    chars = string.ascii_uppercase + string.ascii_lowercase + string.digits + string.punctuation
    size = random.randint(8, 12)
    newPassword = ''.join(random.choice(chars) for x in range(size))
    print(newPassword)

def start():
    print('Option 1: Check my passsword')
    print('Option 2: Create a password')
    option = input('Please chose your option here [ENTER]: ')

    if option == '1':
        #Option 1 has been selected
        return optionOne()
    elif option == '2':
        #Option 2 has been selected
        return optionTwo()
    else:
        #An error has occured
        print('You have not selected a valid option')
        time.sleep(1)
        os.system('cls')
        return start()


for i in range(1):
    start()

これは、ニーズに合わせて微調整する限り、ほとんどすべての仕事をするはずです!!

于 2017-12-12T21:53:59.057 に答える