MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLデータベースにユーザー名とパスワードを安全に保存する方法を解説

MySQLデータベースにユーザー名とパスワードを安全に保存する方法

MySQLデータベースにユーザー名やパスワードを保存する際は、MD5()関数を使ってハッシュ化するのが基本的なアプローチです。平文のまま保存すると情報漏洩のリスクが高まるため、ハッシュ化しておくことでセキュリティを高められます。ここでは、具体的な手順を例とともに解説します。

1. テーブルの作成

まず、CREATE文を使ってユーザー情報を格納するテーブルを作成します。以下の例では「UserNameAndPasswordDemo」というテーブルを定義しています。

mysql> create table UserNameAndPasswordDemo
-> (
-> U_Id int(10) unsigned NOT NULL AUTO_INCREMENT,
-> UserId varchar(255) DEFAULT NULL,
-> UserPassword varchar(255) DEFAULT NULL,
-> primary key(U_Id),
-> UNIQUE KEY `UserId` (`UserId`)
-> );
Query OK, 0 rows affected (0.61 sec)

このテーブルでは、「U_Id」が自動採番される主キーとなっており、「UserId」列にはUNIQUE制約を設定しているため、同じユーザーIDの重複登録を防ぐことができます。

2. MD5()を使ってレコードを挿入する

続いて、INSERT文でレコードを挿入します。ポイントは、パスワードをMD5()関数でハッシュ化してから保存することです。これにより、データベース上に平文のパスワードが残りません。

mysql> INSERT INTO UserNameAndPasswordDemo(UserId, UserPassword) VALUES ('John@gg.com', MD5('john123'));
Query OK, 1 row affected (0.17 sec)

mysql> INSERT INTO UserNameAndPasswordDemo(UserId, UserPassword) VALUES (MD5('Carol@gg.com'), MD5('123Carol'));
Query OK, 1 row affected (0.14 sec)

3. SELECT文でデータを確認する

SELECT文を実行すれば、MD5でハッシュ化されたパスワードを含むレコードを確認できます。まずは、UserIdが「John@gg.com」のレコードだけを抽出してみましょう。

mysql> SELECT *from UserNameAndPasswordDemo where UserId='John@gg.com';

実行結果は以下の通りです。

+------+-------------+----------------------------------
| U_Id | UserId | UserPassword
+------+-------------+----------------------------------
| 1 | John@gg.com | 6e0b7076126a29d5dfcbd54835387b7b
+------+-------------+----------------------------------
1 row in set (0.00 sec)

次に、すべてのレコードを表示します。

mysql> SELECT *from UserNameAndPasswordDemo;

実行結果を見ると、ユーザー名とパスワードの両方がMD5によってハッシュ化されて保存されていることがわかります。

+------+----------------------------------+----------------------------------
| U_Id | UserId | UserPassword
+------+----------------------------------+----------------------------------
| 1 | John@gg.com | 6e0b7076126a29d5dfcbd54835387b7b
| 2 | 5f565a3d794f85e5db4f3bb7b5811a25 | f1d2fb85f7d6ce7428b9b3fd569be42b
+------+----------------------------------+----------------------------------
2 rows in set (0.00 sec)

注意:本番環境ではより強力なハッシュアルゴリズムを推奨

なお、MD5は現在では暗号学的な安全性が低いとされており、実際のサービスでのパスワード保存には推奨されていません。衝突攻撃への耐性が弱いため、本番環境ではbcrypt、Argon2、PBKDF2といったソルト付きの最新ハッシュアルゴリズムを採用しましょう。たとえばPHPであればpassword_hash()関数を利用することで、安全なパスワードハッシュを簡単に生成できます。この記事の手順は、MySQLにおけるハッシュ処理の仕組みを理解するための学習用サンプルとしてご活用ください。

  1. MySQLのデータベースファイルはどこに保存される?保存場所の確認方法

    MySQLがデータベースファイルを実際にどのディレクトリへ保存しているのかを確認したい場合は、システム変数 @@datadir を参照するのが最も簡単な方法です。この記事では、その確認手順と、取得したパスにデータベースが正しく存在することを検証する方法までを解説します。 @@datadirでデータディレクトリを確認する まず、以下のようにSELECT文で@@datadirの値を取得します。 mysql> SELECT @@datadir; 実行結果の例 +---------------------------------------------+ | @@datadir

  2. JDBCを使ってMySQLデータベースにファイルを保存・挿入する方法

    一般的に、ファイルの内容はMySQLデータベースでは Clob 型(TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT)のカラムに保存されます。 JDBCはClob型をサポートしており、これを利用することでファイルの内容をデータベースのテーブルに格納できます。 PreparedStatement インターフェースが提供する setCharacterStream() メソッドは、パラメータのインデックス(位置)を表す整数と、Readerオブジェクトを引数として受け取ります。 このメソッドを使うと、指定したインデックスのプレースホルダ(?)に対して、Readerオブジェクト(ファイ