Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,38 @@
|
|||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace rosettaMySQL
|
||||
{
|
||||
class Hasher
|
||||
{
|
||||
private static string _BytesToHex(byte[] input)
|
||||
{
|
||||
var strBuilder = new StringBuilder();
|
||||
foreach (byte _byte in input)
|
||||
{
|
||||
strBuilder.Append(_byte.ToString("x2"));
|
||||
}
|
||||
return strBuilder.ToString();
|
||||
}
|
||||
|
||||
public static string Hash(string salt, string input)
|
||||
{
|
||||
using (MD5 md5 = new MD5CryptoServiceProvider())
|
||||
{
|
||||
var bytes = Encoding.Default.GetBytes(salt + input);
|
||||
var data = md5.ComputeHash(bytes);
|
||||
return _BytesToHex(data);
|
||||
}
|
||||
}
|
||||
|
||||
public static string GenSalt()
|
||||
{
|
||||
using (RandomNumberGenerator rng = new RNGCryptoServiceProvider())
|
||||
{
|
||||
var salt = new byte[16];
|
||||
rng.GetBytes(salt);
|
||||
return _BytesToHex(salt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
using MySql.Data.MySqlClient;
|
||||
|
||||
namespace rosettaMySQL
|
||||
{
|
||||
class UserOperator
|
||||
{
|
||||
private MySqlConnection _connection;
|
||||
|
||||
public UserOperator(MySqlConnection connection)
|
||||
{
|
||||
_connection = connection;
|
||||
}
|
||||
|
||||
public bool CreateUser(string username, string password)
|
||||
{
|
||||
try
|
||||
{
|
||||
var salt = Hasher.GenSalt();
|
||||
var hash = Hasher.Hash(salt, password);
|
||||
var sql = $"INSERT INTO users " +
|
||||
$"(username, pass_salt, pass_md5) " +
|
||||
$"VALUES ('{username}','{salt}','{hash}')";
|
||||
using (var command = new MySqlCommand(sql, _connection))
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (MySqlException e)
|
||||
{
|
||||
if (e.Number == 1062) //username is a duplicate
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool AuthenticateUser(string username, string password)
|
||||
{
|
||||
var sql = $"SELECT userid, username, pass_salt, pass_md5 " +
|
||||
$"FROM users " +
|
||||
$"WHERE username='{username}';";
|
||||
|
||||
using (var command = new MySqlCommand(sql, _connection))
|
||||
using (var reader = command.ExecuteReader())
|
||||
{
|
||||
if (reader.HasRows)
|
||||
{
|
||||
reader.Read();
|
||||
var salt = reader.GetString("pass_salt");
|
||||
var hash = reader.GetString("pass_md5");
|
||||
return (Hasher.Hash(salt, password) == hash);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
using System;
|
||||
using MySql.Data.MySqlClient;
|
||||
|
||||
namespace rosettaMySQL
|
||||
{
|
||||
class Program
|
||||
{
|
||||
public static MySqlConnection ConnectDB(string server, int port, string db,
|
||||
string username, string password)
|
||||
{
|
||||
var connectStr = $"server={server};" +
|
||||
$"user={username};" +
|
||||
$"database={db};" +
|
||||
$"port={port};" +
|
||||
$"password={password}";
|
||||
return new MySqlConnection(connectStr);
|
||||
}
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
var connection = ConnectDB("localhost", 3306, "test", "root", "password");
|
||||
connection.Open();
|
||||
var userOperator = new UserOperator(connection);
|
||||
Console.WriteLine("Bob has been created: " + userOperator.CreateUser("Bob", "123456"));
|
||||
Console.WriteLine("Bob has been duplicated: " + userOperator.CreateUser("Bob", "123456"));
|
||||
Console.WriteLine("Wrong password works: " + userOperator.AuthenticateUser("BOB", "notpassword"));
|
||||
Console.WriteLine("Right password works: " + userOperator.AuthenticateUser("BOB", "123456"));
|
||||
}
|
||||
catch(MySqlException e)
|
||||
{
|
||||
switch(e.Number)
|
||||
{
|
||||
case 0:
|
||||
Console.WriteLine("Cannot connect to server");
|
||||
break;
|
||||
case 1045:
|
||||
Console.WriteLine("Invalid database username/password");
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine(e.ToString());
|
||||
Console.WriteLine(e.Number);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue