私のサイトはまだ本番環境にありません。公開する前にパスワードのハッシュについてアドバイスが必要で、変更するのは難しいです。通常、私のサイトは EC2 でホストされており、Amazon RDS を使用します。セキュリティを設定するので、データベースにアクセスする唯一の方法は、EC2 マシンに接続している場合です。私のサイトは本当に機密性の高い財務データを保存するつもりはありませんが、メール アドレスとパスワードは確実に保存されます。また、PayPal 取引を許可する可能性が高いため、ユーザーのメール アドレスも PayPal アドレスであることがよくあります。
ハッシュ アルゴリズムを使用した理由の 1 つは、Corona SDK を使用してアプリを構築しているためです。クライアントとサーバーで同様のハッシュ関数を使用することを計画していました。たとえば、クライアントでパスワードをハッシュし、ハッシュされたパスワードを ssl 経由でサーバーに送信できます。補足として、ユーザーのパスワード (ハッシュ化されているかどうかにかかわらず) をクライアントに保存することは決してありません。
一般的な質問
- ユーザーがモバイル アプリ経由でログインできるようにする場合、データをハッシュしてから SSL 経由で送信する方がよいですか、それともユーザーが入力した内容を正確に取得して SSL 経由で送信する方がよいでしょうか。私の懸念は、クライアントでハッシュ アルゴリズムを公開することが本当に悪い考えかどうかです。SSL が安全であることを信頼し、代わりに生データを送信する方がよい場合があります。
- データのハッシュと保存に使用している方法を改善するための提案はありますか? 詳細は以下をご覧ください。
したがって、一般的な考え方は、ユーザーが登録するときに、ユーザーごとに一意のユーザーキーを作成するというものです。このキーは db に格納されます。電子メール アドレスはこのキーを使用して暗号化され、パスワードは同じキーを使用してハッシュされます。
$key = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
パスワード ハッシュは、次の関数を使用して作成されます。
function hash_string($data,$key) {
$hash = hash_hmac('md5', $data, $key);
for ($i = 1; $i <= 100; $i++) {
$data = $hash . $data . $key;
$hash = hash_hmac('md5', $data, $key);
}
$hash = base64_encode($hash);
return $hash;
}
電子メールアドレスは、次の関数を使用して暗号化されます
function encrypt_text($key,$string)
{
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encrypttext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv));
return $encrypttext;
}
これらの機能はさまざまな場所で見つけましたが、セキュリティについてはよく知らないので、フィードバックが必要でした。