Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# pbkdf2_sha256 реализация / 10 сообщений из 10, страница 1 из 1
08.11.2014, 22:30
    #38799504
rebuy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
Добрый вечер.
Опишу проблему: есть в локальной сети предприятия веб-панель написанная на python+django, некоторых работников (2-3 человека) тяжело пересадить под веб, приняли решение писать небольшой АРМ для них. Почти все на коленке написано за вечер благодаря entity framework, но вот авторизация не получается, а вернее не выходит сгенерировать PBKDF_Sha256 хеш пароля.

Несколько паролей:
Пароль - admin - pbkdf2_sha256$10000$L6tcM6DUy9n1$egzIW4RnnN7Q1XybwmCaAMXOcG1ZMiufTdNEt5P2/d8=
Пароль - 123 - pbkdf2_sha256$10000$77riGrGoo5Li$LpQ5S3g2rY/UsNvw2S+oJX6IqQY2gXJWsPTZ6/T4UKw=


В интернете было найдено такое решение но оно не работает:
byte[] inputPasswordByte = System.Text.Encoding.UTF8.GetBytes(this.txtPassword.Text);
byte[] saltByte = System.Text.Encoding.UTF8.GetBytes("L6tcM6DUy9n1");
byte[] hashedPasswordByte = PBKDF2Sha256GetBytes(57, inputPasswordByte, saltByte, 10000);
label3.Text = Convert.ToString(hashedPasswordByte);

https://gist.github.com/peteroupc/6986999
...
Рейтинг: 0 / 0
08.11.2014, 22:34
    #38799505
rebuy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
hasher = hashlib.sha256()
hasher.update(str(random.random()) + str(self.email))
self.key = hasher.hexdigest()
...
Рейтинг: 0 / 0
08.11.2014, 23:04
    #38799515
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
rebuy,
так чо не оно что ли
http://msdn.microsoft.com/ru-ru/library/zhe81fz4(v=vs.110).aspx
гы в ф-и GetBytes тип параметра индусский только
...
Рейтинг: 0 / 0
08.11.2014, 23:08
    #38799519
rebuy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
Где-то в степиrebuy,
так чо не оно что ли
http://msdn.microsoft.com/ru-ru/library/zhe81fz4(v=vs.110).aspx
гы в ф-и GetBytes тип параметра индусский только
Видел, пробовал, тоже не работает так-как нужно, буду по видимому трести разработчиков основной системы, они неохотно что-то делают.
...
Рейтинг: 0 / 0
08.11.2014, 23:15
    #38799523
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
rebuy,
что значит - "как нужно"?
...
Рейтинг: 0 / 0
08.11.2014, 23:17
    #38799524
rebuy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
Где-то в степиrebuy,
что значит - "как нужно"?
ЗНАЧИТ не генерирует пароль в том виде, в котором он хранится в БД.
...
Рейтинг: 0 / 0
09.11.2014, 00:53
    #38799592
rebuy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
Нашел по генерации пароля django.
https://docs.djangoproject.com/en/dev/topics/auth/passwords/

Осталось заставить работать Rfc2898DeriveBytes.
...
Рейтинг: 0 / 0
09.11.2014, 01:28
    #38799633
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
rebuy,
подозреваю что и нативным способом получилось бы
Код: c#
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.
internal class Program
    {
        private static void Main(string[] args)
        {
            var tt = Convert.FromBase64String("egzIW4RnnN7Q1XybwmCaAMXOcG1ZMiufTdNEt5P2/d8=");
            var b = PBKDF2Sha256GetBytes(32, Encoding.Default.GetBytes("admin"), Encoding.Default.GetBytes("L6tcM6DUy9n1"), 10000);
            Console.WriteLine(Convert.ToBase64String(tt));
            Console.WriteLine(Convert.ToBase64String(b));
        }

        public static byte[] PBKDF2Sha256GetBytes(int dklen, byte[] password, byte[] salt, int iterationCount)
        {
            using (var hmac = new System.Security.Cryptography.HMACSHA256(password))
            {
                int hashLength = hmac.HashSize/8;
                if ((hmac.HashSize & 7) != 0)
                    hashLength++;
                int keyLength = dklen/hashLength;
                if ((long) dklen > (0xFFFFFFFFL*hashLength) || dklen < 0)
                    throw new ArgumentOutOfRangeException("dklen");
                if (dklen%hashLength != 0)
                    keyLength++;
                byte[] extendedkey = new byte[salt.Length + 4];
                Buffer.BlockCopy(salt, 0, extendedkey, 0, salt.Length);
                using (var ms = new System.IO.MemoryStream())
                {
                    for (int i = 0; i < keyLength; i++)
                    {
                        extendedkey[salt.Length] = (byte) (((i + 1) >> 24) & 0xFF);
                        extendedkey[salt.Length + 1] = (byte) (((i + 1) >> 16) & 0xFF);
                        extendedkey[salt.Length + 2] = (byte) (((i + 1) >> 8) & 0xFF);
                        extendedkey[salt.Length + 3] = (byte) (((i + 1)) & 0xFF);
                        byte[] u = hmac.ComputeHash(extendedkey);
                        Array.Clear(extendedkey, salt.Length, 4);
                        byte[] f = u;
                        for (int j = 1; j < iterationCount; j++)
                        {
                            u = hmac.ComputeHash(u);
                            for (int k = 0; k < f.Length; k++)
                            {
                                f[k] ^= u[k];
                            }
                        }
                        ms.Write(f, 0, f.Length);
                        Array.Clear(u, 0, u.Length);
                        Array.Clear(f, 0, f.Length);
                    }
                    byte[] dk = new byte[dklen];
                    ms.Position = 0;
                    ms.Read(dk, 0, dklen);
                    ms.Position = 0;
                    for (long i = 0; i < ms.Length; i++)
                    {
                        ms.WriteByte(0);
                    }
                    Array.Clear(extendedkey, 0, extendedkey.Length);
                    return dk;
                }
            }
        }
    }
...
Рейтинг: 0 / 0
09.11.2014, 02:11
    #38799675
rebuy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
Опоздал:) сам дошел
Код: c#
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.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

public class rfc2898test
{
    public const int SALT_BYTE_SIZE = 12;
    public const int HASH_BYTE_SIZE = 32;
    public const int PBKDF2_ITERATIONS = 10000;

    public const int ITERATION_INDEX = 1;
    public const int SALT_INDEX = 2;
    public const int PBKDF2_INDEX = 3;

    public static bool ValidatePassword(string password, string correctHash)
    {
        // Extract the parameters from the hash
        char[] delimiter = { '$' };
        string[] split = correctHash.Split(delimiter);
        int iterations = Int32.Parse(split[ITERATION_INDEX]);
        byte[] salt = Convert.FromBase64String(split[SALT_INDEX]);
        byte[] hash = Convert.FromBase64String(split[PBKDF2_INDEX]);

        byte[] testHash = PBKDF2(password, salt, iterations, hash.Length);
        return SlowEquals(hash, testHash);
    }
    private static bool SlowEquals(byte[] a, byte[] b)
    {
        uint diff = (uint)a.Length ^ (uint)b.Length;
        for (int i = 0; i < a.Length && i < b.Length; i++)
            diff |= (uint)(a[i] ^ b[i]);
        return diff == 0;
    }

    private static byte[] PBKDF2(string password, byte[] salt, int iterations, int outputBytes)
    {
        Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt);
        pbkdf2.IterationCount = iterations;
        return pbkdf2.GetBytes(outputBytes);
    }
    public static string CreateHash(string password)
    {
        // Generate a random salt
        RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider();
        byte[] salt = new byte[SALT_BYTE_SIZE];
        csprng.GetBytes(salt);

        // Hash the password and encode the parameters
        byte[] hash = PBKDF2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
        return "pbkdf2_sha256$" + PBKDF2_ITERATIONS + "$" +
            Convert.ToBase64String(salt) + "$" +
            Convert.ToBase64String(hash);
    }


    public static byte[] PBKDF2Sha256GetBytes(int dklen, byte[] password, byte[] salt, int iterationCount)
    {
        using (var hmac = new System.Security.Cryptography.HMACSHA256(password))
        {
            int hashLength = hmac.HashSize / 8;
            if ((hmac.HashSize & 7) != 0)
                hashLength++;
            int keyLength = dklen / hashLength;
            if ((long)dklen > (0xFFFFFFFFL * hashLength) || dklen < 0)
                throw new ArgumentOutOfRangeException("dklen");
            if (dklen % hashLength != 0)
                keyLength++;
            byte[] extendedkey = new byte[salt.Length + 4];
            Buffer.BlockCopy(salt, 0, extendedkey, 0, salt.Length);
            using (var ms = new System.IO.MemoryStream())
            {
                for (int i = 0; i < keyLength; i++)
                {
                    extendedkey[salt.Length] = (byte)(((i + 1) >> 24) & 0xFF);
                    extendedkey[salt.Length + 1] = (byte)(((i + 1) >> 16) & 0xFF);
                    extendedkey[salt.Length + 2] = (byte)(((i + 1) >> 8) & 0xFF);
                    extendedkey[salt.Length + 3] = (byte)(((i + 1)) & 0xFF);
                    byte[] u = hmac.ComputeHash(extendedkey);
                    Array.Clear(extendedkey, salt.Length, 4);
                    byte[] f = u;
                    for (int j = 1; j < iterationCount; j++)
                    {
                        u = hmac.ComputeHash(u);
                        for (int k = 0; k < f.Length; k++)
                        {
                            f[k] ^= u[k];
                        }
                    }
                    ms.Write(f, 0, f.Length);
                    Array.Clear(u, 0, u.Length);
                    Array.Clear(f, 0, f.Length);
                }
                byte[] dk = new byte[dklen];
                ms.Position = 0;
                ms.Read(dk, 0, dklen);
                ms.Position = 0;
                for (long i = 0; i < ms.Length; i++)
                {
                    ms.WriteByte(0);
                }
                Array.Clear(extendedkey, 0, extendedkey.Length);
                return dk;
            }
        }
    }

    public static void Main()
    {
        SHA256 sha = SHA256.Create();

        Rfc2898DeriveBytes ByteMake = new Rfc2898DeriveBytes("123", sha.ComputeHash(UTF8Encoding.UTF8.GetBytes("77riGrGoo5Li")), 10000);
        Console.WriteLine("LpQ5S3g2rY/UsNvw2S+oJX6IqQY2gXJWsPTZ6/T4UKw=");
        Console.WriteLine(Convert.ToBase64String(ByteMake.GetBytes(32)));


        Console.WriteLine("************************");
        if (!ValidatePassword("123", "pbkdf2_sha256$10000$77riGrGoo5Li$LpQ5S3g2rY/UsNvw2S+oJX6IqQY2gXJWsPTZ6/T4UKw="))
        {
            Console.WriteLine("Разные хеши");
        }
        Console.WriteLine("************************");
        Console.WriteLine("pbkdf2_sha256$10000$L6tcM6DUy9n1$egzIW4RnnN7Q1XybwmCaAMXOcG1ZMiufTdNEt5P2/d8=");
        Console.WriteLine(CreateHash("admin"));

        //Вроде бы только этот код работает и можно использовать!
        Console.WriteLine("************************");
        byte[] psw = System.Text.Encoding.UTF8.GetBytes("admin");
        byte[] slt = System.Text.Encoding.UTF8.GetBytes("L6tcM6DUy9n1");
        Console.WriteLine("egzIW4RnnN7Q1XybwmCaAMXOcG1ZMiufTdNEt5P2/d8=");
        Console.WriteLine(Convert.ToBase64String(PBKDF2Sha256GetBytes(32, psw, slt, 10000)));

        Console.ReadLine();
    }
}
...
Рейтинг: 0 / 0
09.11.2014, 17:15
    #38799929
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# pbkdf2_sha256 реализация
all на ночь
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# pbkdf2_sha256 реализация / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]