2016-10-13 14 views
2

javaでユーザを認証するための関数を作成しました。私はSHA1を暗号化されたデータに使用し、私はそれをMySQLに保存しました。その後、私はMySQLデータベースからデータを渡すためにパラメトリッククエリを作成しました。しかし、私はそのクエリラインにエラーがありました。私はSHA1の値をデータベースに変更した後、私のクエリでSHA1という単語を削除します。本当にそれは何の誤りもなく仕事です。しかし、私は取得し、SHA1データベースからデータを暗号化して確認したい。データベースSHA1を暗号化したデータをクエリに渡す方法。誰かが私の問題を解決するのを助けてください。ライン作業javaコードのmysqlデータベースでsha1ハッシュ値を取得する方法

public boolean authenticate(String username, String password){ 
    Connection newConnection = null; 
    ResultSet newRst = null; 
    boolean flag = false; //return value which determines whether logged in or not 
    String SqlString = "SELECT * FROM user" 
      + " WHERE username=? AND password=SHA1(?)"; //Error line when use SHA1() 

    String Username = username; 
    String Password = password; 

    String CheckUsername; 
    String CheckPassword; 

    List<String> ParametersDefined = 
      Arrays.asList(Username, Password); 
    List<String> ParametersNames = Arrays.asList("username", "password"); 
    List<String> ParameterDataType = 
      Arrays.asList("String", "String"); 

    DatabaseHandling newData = new DatabaseHandling(); 
    try { 

     newConnection = newData.DataConnection();// creating the connection 
     newRst = newData.DataReadArg(newConnection, SqlString, 
       ParametersDefined, ParametersNames, ParameterDataType); 
     //check whether one row or more 

     int RowCount = 0; // to find the row count 
     while (newRst.next()) { 
      //checking whether we are getting right row 
      System.out.println("this is " + newRst.getString(2)); 

      RowCount++; 
     } 
     //if the Row count is one then it check  
     if (RowCount == 1) { 
      newRst.first(); 
      CheckUsername = newRst.getString("username"); 
      CheckPassword = newRst.getString("password"); 

      if ((username.equals(CheckUsername)) 
        && password.equals(CheckPassword)) { 
       userRoleId = newRst.getInt("userRoleId"); 
       System.out.println("role = " + userRoleId); 
       flag = true; 
      } 
     } 

    } catch (Exception e) { 

     System.out.println("Error" + e.getMessage()); 
     flag = false; 

    } 

    return flag; 
} 

...

String SqlString = "SELECT * FROM user" + " WHERE username=? AND password=?"; //Without SHA1 String. It's working without any errors.

+0

sha1()を含むクエリを実行しようとすると、Plsは正確なエラーメッセージを共有します。 – Shadow

+0

エラーメッセージは表示されませんでした。しかし、それは動作していないと私のシステムに行っていない。 –

+0

次に、sha1()関数を使用してパスワードを保護しているとは限りません。 Btw、ハッシュ関数は何も暗号化しません。暗号化は元に戻すことができ、ハッシュは元に戻すことはできません。 – Shadow

答えて

1

データベースからユーザデータをフェッチするあなたのアプローチを変更する必要があります。 「SELECT * FROM user WHERE username =?とパスワード=? " " SELECT * FROM user WHERE username =? "だけを使用してください。

ユーザー名のみに基づいてユーザーを取得します。ユーザーデータが利用可能になったら、暗号化されたパスワードをデータベース値で確認します。あなたは、以下の検証を分離することができます

この方法は -

  1. ユーザーは、「ユーザー名」のユニークな値を使用して、システムに存在します。

  2. ユーザーが存在する場合は、パスワードを確認してください。

クロス検証ユーザーの資格情報は、ビジネスロジック(Javaサービス)内になければならず、データベース全体に広げてはいけません。

関連する問題