C# PHP phpass转换为C脚本
我有一个网站,通过以下脚本进行身份验证,并生成一个以$p$B开头的密码C# PHP phpass转换为C脚本,c#,password-encryption,phpass,C#,Password Encryption,Phpass,我有一个网站,通过以下脚本进行身份验证,并生成一个以$p$B开头的密码 public static function hashPassword($plainPassword) { // use openwall.com phpass class $hasher = new PasswordHash(8, true); return $hasher->HashPassword($plainPassword); } public static function ch
public static function hashPassword($plainPassword)
{
// use openwall.com phpass class
$hasher = new PasswordHash(8, true);
return $hasher->HashPassword($plainPassword);
}
public static function checkPassword($plainPassword, $hashedPassword)
{
// try with md5
if (md5($plainPassword) == $hashedPassword) return true;
// using openwall.com phpass class
$hasher = new PasswordHash(8, true);
return $hasher->CheckPassword( $plainPassword, $hashedPassword );
}
使用此类:
}
我有兴趣在登录时为使用C的应用程序对相同的用户使用相同的加密模式。有人能帮我从PHP到C的转换吗?这是新的用户注册部分:
private void button3_Click(object sender, EventArgs e)
{
MySqlConnection sqlcon = new MySqlConnection(@"server=xx.xx.xx.xx;user id=user;password=password;persistsecurityinfo=False;database=website;sslmode=None;");
string query = "Select * from users Where username= '" + tbUser.Text + "'";
MySqlDataAdapter sda = new MySqlDataAdapter(query, sqlcon);
DataTable dtbl = new DataTable();
sda.Fill(dtbl);
if (dtbl.Rows.Count > 0)
{
MessageBox.Show("Username exist!");
}
else
{
if(tbUser.Text == "" | tbPass.Text == ""){
MessageBox.Show("Fill in properly !");
}
else
{
try
{
string commString = "INSERT INTO users (username, password, permissions, homedir) VALUES (@val1, @val2, @val3, @val4)";
string constring = @"server=xx.xx.xx.xx;user id=user;password=password;persistsecurityinfo=False;database=website;sslmode=None;";
string savedPasswordHash = CryptSharp.Crypter.Phpass.Crypt(tbPass.Text, salt);
using (MySqlConnection conn = new MySqlConnection(constring))
{
using (MySqlCommand comm = new MySqlCommand())
{
comm.Connection = conn;
comm.CommandText = commString;
comm.Parameters.AddWithValue("@val1", tbUser.Text);
comm.Parameters.AddWithValue("@val2", savedPasswordHash);
comm.Parameters.AddWithValue("@val3", "rwu");
comm.Parameters.AddWithValue("@val4", "/var/www/repository/HOME");
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
}
}
MessageBox.Show("Register OK!");
tbPass.Text = null;
sqlcon.Close();
}
catch
{
MessageBox.Show("Eroare. Contact admin!");
}
}
}
}
以下是登录部分:
string userLogat = tbUser.Text;
MySqlConnection sqlcon = new MySqlConnection(@"server=xx.xx.xx.xx;user id=user;password=password;persistsecurityinfo=False;database=website;sslmode=None;");
string query = "Select * from users Where username= '" + tbUser.Text + "'";
MySqlDataAdapter sda = new MySqlDataAdapter(query, sqlcon);
DataTable dtbl = new DataTable();
sda.Fill(dtbl);
if (dtbl.Rows.Count == 1)
{
string savedPasswordHash = dtbl.Rows[0][3].ToString();
if (ValidatePassword(tbPass.Text, savedPasswordHash, salt))
{
MessageBox.Show($"Wellcome {tbUser.Text} !");
FormMain openMain = new FormMain(userLogat);
openMain.Show();
this.Hide();
}
else
{
MessageBox.Show($"Password for {userLogat} error.");
}
}
else
{
MessageBox.Show($"Username error!");
}
sqlcon.Close();
首先通过以下方式实现:
string salt = CryptSharp.Crypter.Phpass.GenerateSalt(8);
通过以下方式检查您的密码:
public static bool ValidatePassword(string pass, string passCriptat, string salt)
{
string CryptedInput = CryptSharp.Crypter.Phpass.Crypt(Encoding.ASCII.GetBytes(pass), salt);
string CryptedPassword = CryptSharp.Crypter.Phpass.Crypt(Encoding.ASCII.GetBytes(passCriptat), salt);
return string.Equals(CryptedInput, CryptedPassword);
}
经过多次尝试,我们成功了。以下是解决方案: 登录按钮:
string userLogat = tbUser.Text;
MySqlConnection sqlcon = new MySqlConnection(@"server=xx.xx.xx.xx;user id=user;password=password;persistsecurityinfo=False;database=website;sslmode=None;");
string query = "Select * from users Where username= '" + tbUser.Text + "'";
MySqlDataAdapter sda = new MySqlDataAdapter(query, sqlcon);
DataTable dtbl = new DataTable();
sda.Fill(dtbl);
if (dtbl.Rows.Count == 1)
{
string savedPasswordHash = dtbl.Rows[0][3].ToString();
if (CryptSharp.Crypter.CheckPassword(tbPass.Text, savedPasswordHash))
{
MessageBox.Show($"Wellcome {tbUser.Text} !");
FormMain openMain = new FormMain(userLogat);
openMain.Show();
this.Hide();
}
else
{
MessageBox.Show($"Parola pentru userul {userLogat} nu exista valida.");
}
}
else
{
MessageBox.Show($"Username incorect!");
}
sqlcon.Close();
注册部分是:
MySqlConnection sqlcon = new MySqlConnection(@"server=xx.xx.xx.xx;user id=user;password=password;persistsecurityinfo=False;database=website;sslmode=None;");
string query = "Select * from users Where username= '" + tbUser.Text + "'";
MySqlDataAdapter sda = new MySqlDataAdapter(query, sqlcon);
DataTable dtbl = new DataTable();
sda.Fill(dtbl);
if (dtbl.Rows.Count > 0)
{
MessageBox.Show("Username exista!");
}
else
{
if(tbUser.Text == "" | tbPass.Text == ""){
MessageBox.Show("Completati campurile corespunzator !");
}
else
{
try
{
string commString = "INSERT INTO users (username, password, permissions, homedir) VALUES (@val1, @val2, @val3, @val4)";
string constring = @"server=xx.xx.xx.xx;user id=user;password=password;persistsecurityinfo=False;database=website;sslmode=None;";
string savedPasswordHash = CryptSharp.Crypter.Phpass.Crypt(tbPass.Text, salt);
using (MySqlConnection conn = new MySqlConnection(constring))
{
using (MySqlCommand comm = new MySqlCommand())
{
comm.Connection = conn;
comm.CommandText = commString;
comm.Parameters.AddWithValue("@val1", tbUser.Text);
comm.Parameters.AddWithValue("@val2", savedPasswordHash);
comm.Parameters.AddWithValue("@val3", "rwu");
comm.Parameters.AddWithValue("@val4", "/var/www/repository/HOME");
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
}
}
MessageBox.Show("Inregistrare reusita!");
tbPass.Text = null;
sqlcon.Close();
}
catch
{
MessageBox.Show("Eroare la inregistrare. Contactati administratorul !");
}
}
}
在初始化之前,我放盐:
string salt = CryptSharp.Crypter.Phpass.GenerateSalt(8);
很乐意帮忙-到目前为止你做了什么?请给我们看一下你的C代码。用C生成的密码在PHP的网站上注册新登录,C应用程序就不工作了。我哪里错了?
string salt = CryptSharp.Crypter.Phpass.GenerateSalt(8);