diff options
author | marcinzelent <zelent.marcin@gmail.com> | 2018-03-17 15:33:00 +0100 |
---|---|---|
committer | marcinzelent <zelent.marcin@gmail.com> | 2018-03-17 15:33:00 +0100 |
commit | f68bb1864b40c69d12b44db5aa33125aef39e150 (patch) | |
tree | bb11f3714a2aa99708f5cca2feec3ff68d3e5b88 /DistributedPasswordCracker.Server/Utilities | |
parent | 7e2a8dbd051b94115672cf22cc66ef09ba8376ca (diff) |
Restructuring
Diffstat (limited to 'DistributedPasswordCracker.Server/Utilities')
-rw-r--r-- | DistributedPasswordCracker.Server/Utilities/PasswordFileHandler.cs | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/DistributedPasswordCracker.Server/Utilities/PasswordFileHandler.cs b/DistributedPasswordCracker.Server/Utilities/PasswordFileHandler.cs new file mode 100644 index 0000000..e4b1e76 --- /dev/null +++ b/DistributedPasswordCracker.Server/Utilities/PasswordFileHandler.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Cryptography; +using DistributedPasswordCracker.Server.Models; + +namespace DistributedPasswordCracker.Server.Utilities +{ + class PasswordFileHandler + { + private static readonly Converter<char, byte> Converter = CharToByte; + + /// <summary> + /// With this method you can make you own password file + /// </summary> + /// <param name="filename">Name of password file</param> + /// <param name="usernames">List of usernames</param> + /// <param name="passwords">List of passwords in clear text</param> + /// <exception cref="ArgumentException">if usernames and passwords have different lengths</exception> + public static void WritePasswordFile(String filename, String[] usernames, String[] passwords) + { + HashAlgorithm messageDigest = new SHA1CryptoServiceProvider(); + if (usernames.Length != passwords.Length) + { + throw new ArgumentException("usernames and passwords must be same lengths"); + } + using (FileStream fs = new FileStream(filename, FileMode.CreateNew, FileAccess.Write)) + using (StreamWriter sw = new StreamWriter(fs)) + { + for (int i = 0; i < usernames.Length; i++) + { + byte[] passwordAsBytes = Array.ConvertAll(passwords[i].ToCharArray(), GetConverter()); + byte[] encryptedPassword = messageDigest.ComputeHash(passwordAsBytes); + String line = usernames[i] + ":" + Convert.ToBase64String(encryptedPassword) + "\n"; + sw.WriteLine(line); + } + } + } + + /// <summary> + /// Reads all the username + encrypted password from the password file + /// </summary> + /// <param name="filename">the name of the password file</param> + /// <returns>A list of (username, encrypted password) pairs</returns> + public static List<UserInfo> ReadPasswordFile(String filename) + { + List<UserInfo> result = new List<UserInfo>(); + + FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); + using (StreamReader sr = new StreamReader(fs)) + { + + while (!sr.EndOfStream) + { + String line = sr.ReadLine(); + String[] parts = line.Split(":".ToCharArray()); + UserInfo userInfo = new UserInfo(parts[0], parts[1]); + result.Add(userInfo); + } + return result; + } + } + + public static Converter<char, byte> GetConverter() + { + return Converter; + } + + /// <summary> + /// Converting a char to a byte can be done in many ways. + /// This is one way ... + /// </summary> + /// <param name="ch"></param> + /// <returns></returns> + private static byte CharToByte(char ch) + { + return Convert.ToByte(ch); + } + } +}
\ No newline at end of file |