2016-09-02 4 views
0

the Security SEの方がより良い質問かもしれませんが、これは尋ねるのに悪い場所ではないと思います。メールでワンタイムパスワードを送信する

私は企業内でオンライン選挙を開催するWebアプリケーションを開発しています。選挙人は、アプリにログインして好きな候補者に投票し、その後アプリを終了することができます。

選挙人すべてのPHPのrandom_bytes()でPHPのrandom_int()と完全に予測不可能なパスワード(で(少なくとも4ランダムな整数でかなり予測不可能なユーザ名を割り当てられます。

クライアントはすべての選挙のユーザ名とパスワードを送信したいを(時には最大5,000人の異なる人)が電子メールで私は大ファンではありませんが、それは私のための仕事であり、SSLの上で送信されるので、少なくともそれは何かです。

私は、一度だけ投票しなければならないので、投票が行われた直後にアカウントを無効にすることができます。同じ資格で再度ログインするそれではうまくいきません。また、私は24時間ごとにパスワードを変更し、まだ投票していない選挙人に、更新された資格情報で新しい電子メールを送ることができます。選挙は通常3〜5日間続きますので、更新された電子メールは自動的に票を投じるように通知します。選挙が終了すると、関連するすべてのアカウントも非アクティブになります。

これで十分ですか?私はトークンを使って1回のURIを使用するようにプッシュする記事をたくさん読んだことがありますが、アプリケーション内の作成されたアカウントは一度しかログインできず、その後は非アクティブになります。私の考えでは、ユーザが新しいパスを作成するためのフォームを持つURIは、一度ログインすれば永久にアカウントを忘れるので、ユーザにとって面倒です。

注:生成されたすべてのパスワードは、データベースに格納される前にbcrypt()を渡します。電子メールは、パスワードが生成された直後に送信されます。実際には、パスワードがプレーンテキストで表示される唯一の時間です(ただし、SSL上では、それは価値があります)。

+3

トークンを使用して一意のURLを送信すると、パスワードを作成するためにフォームが必要なのはなぜですか?あなたが言ったように、彼らは完全なユーザーアカウントに繰り返しログインするのではなく、1回限りのアクションを実行してからロックしたアカウントを実行することが許可されています。 URLをメールで送信して投票したら、URLを期限切れにすることはできませんか?ユーザーIDやランダムなものなどの一意の識別子を使用してURLのトークンを生成し、bcryptなどの強力なハッシングアルゴリズムで実行します。 – BadHorsie

+0

それでもURLにユーザ名とパスワードを送信する必要がありますか?このパッケージはジョブのためにまともに見えません。https://github.com/spatie/laravel-url-signer – Loek

+0

いいえ、あなたはユーザー名やパスワードは必要ありません。一意で安全なハッシュで、ユーザーレコードと共に格納されます。 – BadHorsie

答えて

2

あなたの説明からは、ユーザーアカウントはまったく必要ないと思っています。そうしないと、すぐにアカウントを削除することは考えられません。選挙は匿名だと思われるので、選挙をユーザーに関連付ける理由はありませんが、それは正しいのですか?

上記の内容が正しい場合は、電子メールアドレスとランダムトークンを一緒に保存するだけです。トークンは、URLの一部としてユーザーに送信できます。ユーザーがリンクをクリックすると、このトークンが存在するかどうかをチェックすることができます。選挙を完了すると、電子メール/トークンを削除できます。これにはユーザー名やパスワードは必要ありません。

トークンは十分に強くなければなりません(少なくとも20文字はaz AZ 0-9)。トークンが十分に強ければ、SHA-256などの高速ハッシュを使用できますが、そのハッシュのみをデータベースに格納する必要がありますソルトなしで、データベース内で検索することができます。

+0

Hmm選挙記録は、必ずしもユーザーレコードと実際にリンクする必要はありません。選挙記録が選挙と関連している限り、すべてが問題ありません。これは実際には素晴らしいソリューションかもしれません、ありがとう! – Loek

+1

@Loekこれはまさに私が言いたいことです。 – BadHorsie

+0

私はあまりにも多くのことを考え出しました、両方に感謝! – Loek