aboutsummaryrefslogtreecommitdiff
blob: e4b1e760732d648f250232eb7911c7a30d72e000 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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);
        }
    }
}