2

ログイン データを格納する Mysql データベースがあります。パスワードとソルトは sha512 ハッシュとして保存されます。ここで、パスワード列の値が変更された場合、ソルトを変更する必要があるか、mysql コマンドが無効であるという条件を実装したいと考えています。

CREATE TABLE loginData(
id int UNSIGNED SERIAL DEFAULT VALUE,
email varchar(64) NOT NULL,
password binary(64) NOT NULL,
salt binary(64) NOT NULL,
PRIMARY KEY(id))
ENGINE=InnoDB;

今、外部キーの整合性制約のようなものを考えていましたが、明らかに、パスワードとソルトの列を外部キーとして接続するべきではありません。Mysql側でパスワード列のみを更新しないようにする方法はありますか?新しいソルトを指定する必要がありますか? コードにアクセスする側だけでそれを防ぐのは不完全だと感じます。

4

2 に答える 2

0

データベースにアクセスするシステムが複数ある場合を除き、アクセスするコードでのみ防止するのは不完全だとは言えません。テーブルに対する適切な書き込み権限を管理者に付与しないことで、管理者が手動でデータを更新するのを防ぐことができます。

ただし、MySQL でこれを強制する必要がある場合は、トリガー (レコードの更新後に実行されるコード) を追加することを検討できますが、salt がアプリケーションからのものである場合、これはおそらく実現不可能です。その場合、最適なオプションは、ストアド プロシージャ (データベースに常駐するコード) を介してのみテーブルへのアクセスを提供することです。これにより、テーブルの整合性が強化されます。

http://dev.mysql.com/doc/refman/5.6/en/store-programs-views.htmlを参照してください。

于 2012-12-04T19:33:33.820 に答える
0

できる方法の 1 つは、パスワードの変更のためにログイン レコードを実際に更新するのではなく、新しいレコードを挿入することです。activeアクティブなログインであることを示すフラグを格納するために、名前付きまたは類似の tinyint フィールド名を追加するには、スキーマを変更する必要があります。

次に、電子メール/ソルトと電子メール/パスワードに一意のインデックスを追加して、これらの組み合わせを一意にすることができます。つまり、同じ電子メールに同じソルトが入力されることはなく、同じ電子メール/パスワードの組み合わせを入力することもできません。同じ電子メール/ソルトまたは電子メール/パスワードを使用した挿入は失敗します。パスワードの一意性が必要ない場合 (メール/パスワードの一意のインデックスを追加しないことは明らかです)。

実際に資格情報チェックを実行するためにログインを検索するときはWHERE active = 1、クエリ フィルターに追加するだけです。

active = 0また、トランザクション全体が成功または失敗するように、新しいソルトとパスワードのレコードを挿入し、古い行を更新する操作をトランザクション内にラップして、ユーザーがログインせずにスタックするケースを防ぐこともできます。

于 2012-12-04T19:09:10.247 に答える