Initial data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 72d218235f
commit f23f22d71c
199087 changed files with 3378941 additions and 0 deletions

View file

@ -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);
}
}
}
}

View file

@ -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;
}
}
}
}
}

View file

@ -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());
}
}
}
}