2014-01-23 18 views
0

開發環境: 微軟的Visual Studio 2010旗艦版, C#, MySql的調用的MySQL函數在C#中驗證用戶名和密碼

嗨,我已經在MySQL中建立一個函數,它接受3個參數,以驗證用戶名和密碼。

DELIMITER $$ 

USE `generalledger`$$ 

DROP FUNCTION IF EXISTS `fLogin_Check`$$ 

CREATE DEFINER=`root`@`localhost` 
FUNCTION `fLogin_Check` 
(mUserName VARCHAR(50),mUserPass VARCHAR(40),mUserKey VARCHAR(40)) RETURNS INT 
BEGIN 
DECLARE mCount INT; 

SELECT COUNT(*) INTO mCount FROM userMaster  
WHERE userName = mUserName 
AND AES_DECRYPT(userPass, mUserKey) = UPPER(mUserPass); 

IF mCount > 0 THEN 
RETURN 1; 
ELSE 
RETURN 0; 
END IF; 
END$$ 

DELIMITER ; 

正如你看到的,我使用的是MySQL的AES_DECRYPT函數來檢查密碼,因爲我已經使用AES_ENCRYPT密碼時插入用戶名和密碼的MySQL表。

現在我需要調用的函數fLogin_Check在C#中,其中我用下面的類方法做:

public int CheckUser(string mUserName, string mPass, string mKey) 
{ 
    oCn = da.GetConnection(); 

    int res; 

    if (oCn == null) 
    { 
     oCn.Open(); 
    } 

    sInsProcName = "fLogin_Check"; 
    insertcommand = new MySqlCommand(sInsProcName, oCn); 
    insertcommand.CommandType = CommandType.StoredProcedure; 
    insertcommand.Parameters.Add(new MySqlParameter("mRes", MySqlDbType.Int32, 0)); 
    insertcommand.Parameters["mRes"].Direction = ParameterDirection.ReturnValue; 
    insertcommand.Parameters.Add("mUserName", MySqlDbType.VarChar, 50, mUserName); 
    insertcommand.Parameters.Add("mUserPass", MySqlDbType.VarChar, 40, mPass); 
    insertcommand.Parameters.Add("mUserKey", MySqlDbType.VarChar, 40); 
    insertcommand.Parameters["mUserKey"].Value = mKey; 

    res = insertcommand.ExecuteNonQuery(); 
    //res = int.Parse(insertcommand.Parameters["mRes"].Value.ToString()); 

    return (res); 

    oCn.Close(); 
} 

OCN是用來調用getConnection方法在我的DAL類和DA定義連接赤貧是從DAL類創建的對象,用於打開和關閉數據庫連接。

使用以下全局類我保存用戶後用戶名和密碼進入它們,然後嘗試用fLogic_Check Mysql的功能驗證:

public static class Globals 
{ 
    public static string userName; 
    public static string userPass; 
    public const string sKey = "AHMEDFINANCEICMAP1122"; 
} 

SKEY是我使用時插入用戶名密碼加密密鑰。現在我想,當用戶輸入用戶名和密碼,然後點擊與下面的代碼登錄按鈕,使用它在C#中的登錄表單:

private void btnCheck_Click(object sender, EventArgs e) 
{ 
    Globals.userName = txtUser.Text.ToString(); 
    Globals.userPass = txtPass.Text.ToString(); 

    if (fUser.CheckUser(Globals.userName, Globals.userPass, Globals.sKey) == 0) 
    { 
     MessageBox.Show("Invalid Username or Password."); 
    } 
    else 
    { 
     MessageBox.Show("Login Successfull"); 
    } 
} 

,它總是返回0,意味着登錄失敗。我檢查了的MySQL GUI Mysql的功能,並能正常工作:

SELECT fLogin_Check("AHMED","AHMED1981","AHMEDFINANCEICMAP1122") FROM userMaster 

成功地返回1,但在C#中調用時失敗。我也嘗試訪問參數,我失敗後發表評論......我做錯了什麼?

艾哈邁德

回答

0

代碼有多種問題。

首先,也是最重要的:它更好地與散列函數,而不是可逆cryptographyc方法存儲密碼,否則你失去它們加密的好處。我不會更深入地解釋這一點,因爲它已經被廣泛討論,即使在這裏,在stackoverflow。做一些研究。

其次,「的ExecuteNonQuery」將不會返回您的查詢輸出。它用於INSERT和UPDATE查詢。您需要使用「ExecuteReader」,然後使用返回的對象來提取行數據。

最後,你的 「oCn.Close();」將永遠不會被執行,因爲在該行之前有一個「返回」(顯然,這不是問題,但嘿!)。

現在,因爲你需要在第一行的第一個值,有一個更好的功能,適合您的需要:的ExecuteScalar。你可以在MSDN上找到更多關於它的信息。

+0

感謝您的答案......我因此就改變了我的代碼的ExecuteScalar擔心,現在正在!!! ...我將做主題鹽醃和散列的研究後會改變我的代碼瞭解它...如果你可以分享任何示例/示例鏈接,這將有所幫助。由於 – Ahmed

+0

有一個美麗的文章在這裏https://crackstation.net/hashing-security.htm這裏HTTP:// WWW。codeproject.com/Articles/425150/Beginners-guide-to-a-secure-way-of-storing-passwor – JohnKiller

+0

非常感謝......我現在忙於自己研究它......並嘗試實施它 – Ahmed