2016-12-21 8 views
0

私は自分の小さなプログラムを作成してユーザー名/パスワードを作成し、AESで暗号化してから、暗号化されたパスワード、およびキーをMySQLデータベースに格納します。私の今後の計画は、データベースからこの情報を取得し、それを解読してデータベースに対するログイン情報をチェックすることによって、ユーザが「ログイン」できるようにすることです。秘密鍵、暗号化されたパスワードをMySQL経由でJDBCに保存しようとしています

現在、私はすべての暗号化/復号化機能をJavaで動作させています。私はさまざまな入力を使用してそれをテストし、メソッドがすべて正しく動作することを知っています。私が実行している問題は、この情報をMySQLデータベースに格納することです。データベースに接続してSELECTクエリを実行することはできますが、INSERT文を使用して情報を格納するとエラーが発生します。ここで

は私のMySQLデータベースのセットアップです:

public static void main(String[] args) throws Exception { 

    String plainText = "test"; 
    SecretKey secKey = getSecretEncryptionKey(); // working correctly 
    byte[] cipherText = encryptText(plainText, secKey); // working correctly 
    String decryptedText = decryptText(cipherText, secKey); // working correctly 
    byte[] secKey2 = secKey.getEncoded(); // necessary?? 

    try{ 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Test?useSSL=false","****","****"); // user/pass commented out 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery("use Test;"); 
     stmt = con.createStatement(); 
     stmt.executeUpdate("INSERT INTO Accounts (username, password, key) VALUES ('test1', '"+cipherText+"', '"+secKey2+"');"); 
     con.close(); 
    } catch(Exception e){ 
     System.out.println(e); 
    } 

} 

私が取得エラー:私が使用

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key) VALUES ('test1', '[[email protected]', '[[email protected]')' at line 1 

スキーマここ

mysql> SHOW COLUMNS FROM Accounts; 
+----------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+----------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| username | varchar(45) | NO | UNI | NULL |    | 
| password | blob  | NO |  | NULL |    | 
| key  | blob  | NO |  | NULL |    | 
+----------+-------------+------+-----+---------+----------------+ 
4 rows in set (0.00 sec) 

は、問題のコードです私のデータベースの "テスト"と呼ばれます。 「テストの使用」クエリが機能しているようです。

上記の例では、「test1」はユーザー名、cipherTextはハッシュされたパスワード、secKey2はバイト配列にエンコードされたキーです。

キーをバイト配列に変換してblobとして格納するのが最善だと読んでいるので、キーをバイト配列に変換する場合と変換しない場合の両方でこれを試みました。私はVARCHARとして 'password'と 'key'フィールドを使ってこれを試しました。私は彼らが正しく動作することを知っているので、私は暗号化/復号化のためのメソッドを含めていない、問題は、データベースに情報を格納しています。

ご協力いただければ幸いです!

+0

こんにちは。あなたが得ているエラーに関するより具体的な情報を教えてください。 – Maurice

+0

私が得ているエラーは、Javaコードのすぐ下に含まれています。私はEclipseを使用しています。これがエラー出力として表示される唯一のものです。 – JAM1295

+0

パスワードを暗号化せずにハッシュする必要があります。 – EJP

答えて

1

@Jose_Ferrerの回答は、コードのいくつかの問題を指摘しています(たとえば、計算されたハッシュではなくバイト配列のアドレスを格納しています)。

ただし、発生している構文エラーメッセージは、これに直接関係しません。データベースに保存されている無駄な文字列になりますが、それはデータベースが不平を言うことはありません。

テーブルのフィールドとして "キー"予約語を使用しているために、構文エラーが発生しているようです。 SQLパーサーは、フィールド名が必要なキーワード(キー)を見つけようとしています。

+0

それは見えませんでした。いいキャッチ! –

+0

ああ、私はそれを固定信じて、ありがとう!私はあなたとJoseが言っていたことを認識しています。私は実際にあなたが提案したことをやることを実際に意図していました。私は今、私のコードを変更し、うまくいきます。助けてくれてありがとう! – JAM1295

1

ルートでは、2バイトの配列を適切な列に格納しようとしています。表示されている問題は、挿入ステートメントの作成に使用している文字列の連結によって発生します。あなたが を言うとき、あなたが本当に言っている "INSERT INTO Accounts (username, password, key) VALUES ('test1', '"+cipherText+"', '"+secKey2+"');" "INSERT INTO Accounts (username, password, key) VALUES ('test1', '"+cipherText.toString()+"', '"+secKey2.toString()+"');" ものである[735b478 @ Bと[それはデフォルトObject.toString()実装だからB @の2c9f9fb0値は(事実上)、これらのアレイ用のポインタアドレスです。

文字列連結でSQL文を作成しないでください。 SQL Injectionにあなたを開くことの上に、読んだり維持しにくいコードになります。文の代わりにPreparedStatementを使用すると、setBlob()のメソッドを使用できます。しかし、からBlobを取得する方法がわかりません。 Base64でbyte[]をエンコードしてvarcharsとして保存することもできますが、それは他の話題です。

DBに任意の種類の可逆形式でパスワードを保存する必要があるかどうかについては、hereを参照してください。

+0

私は、「パスワード」によって、平文のパスワードではなく、ハッシュされた塩味のパスワードを意味することを明確にする必要があります。プレーンテキストは、ハッシュされると破棄されます。 – JAM1295

関連する問題