3

現在、.net/c# を使用してログインおよび登録システムを作成しています。SQLサーバーデータベースには、ユーザー名とパスワードが保持されています(ソルトなどでハッシュされたパスワード)

パスワードを検証する必要がある場合、現在の手順は何ですか。ユーザーが入力した値をソルトなどでハッシュし、ストアドプロシージャに渡してそこで比較することですか? または、上記と同じ手順ですが、C# コードでパスワードを比較しますか?

ベストプラクティスと最も安全な方法に基づいて決定したいので、これに関する提案と考慮すべき項目を探しています.

4

4 に答える 4

1

これは6と2の3だと思います。私にとって重要なことは、パスワードではなくハッシュを保存しているということです。それは良いデザインです。

私が追加する唯一のことは、一貫性を保つことだけです。おそらく、ログインを処理するだけでなく、ユーザーがアカウントを作成したりパスワードをリセットしたりするときに、ハッシュエンジンも機能します。すべてを1つのブラックボックスに保管してください。言い換えれば、データベースまたはc#の1つはかなりインテリジェントで、もう1つはかなり馬鹿げている必要があります。

再利用性からそれを実現できると思います....別のデータベースでセキュリティメカニズムを再利用したいと思う可能性はありますか?またはその上にコンポーネントの層がないのですか?それはあなたの選択を左右するかもしれません。

私が考えることができる他の唯一のことは、アプリ内のデータの変更(つまり、日常のビジネス機能)にどのようなセキュリティを設定しているかです。その側面があなたの決定に影響を与える可能性がありますか?

于 2012-12-11T21:30:42.107 に答える
0

私は常にユーザー名/メールの一般的な検証を行い、それを使用してdbからパスワードを取得し、ユーザーが入力したコードの値と比較します...私はデータベースがコードをサポートしていると思わせるdbaではなく開発者です(その逆ではありません)したがって、速度が影響を受けないこのような状況が発生した場合、ロジックをコードにプッシュします。

本当に正しいか間違っているかではありません..私がすることだけ

編集:常にパスワードを暗号化/ハッシュします。

于 2012-12-11T21:26:25.070 に答える
0

あなたが最もよく知っているものを使用してそれを比較する必要があります。パスワードが間違っている場合にストアド プロシージャをだまして "True" を返す方法がないことを絶対に確信していない限り、コードで比較することをお勧めします。「 select * from users where login 〓 [value]」のようなことはしないようにアドバイスします。

私はむしろやりたい:

  • ユーザー入力をサニタイズします (つまり、SQL エラーまたは SQL インジェクションにつながる不要な文字をエスケープします)

  • ユーザーとハッシュ化されたパスワードの両方を入力として受け取るパラメーター化されたクエリまたはストアド プロシージャを準備します。

  • spが一致するすべての行と両方のフィールド(ログインとパスワード)を返すようにします

  • コードで、sp が 1 行のみを返したこと、およびログインとパスワードの両方がユーザー入力と一致していることを確認します (一部の SQL インジェクションを回避します)。

これらのいくつかは冗長ですが、とにかくセキュリティを強化してください。

于 2012-12-12T16:52:45.547 に答える
0

どちらの方法でも機能しますが、個人的には C# コードで比較します。

私の懸念は、誰かがデータベースにアクセスした場合、検証 sproc を変更して、ハッシュが一致しなくても常に成功を返すことができるということです。しかし、これは実際には、アプリケーション コードのセキュリティとデータベースのセキュリティのどちらをより信頼するかにかかっています。

于 2012-12-11T21:16:17.933 に答える