2016-03-22 2 views
0

Я ищу, чтобы сгенерировать код, который будет создан из имени пользователя и пароля пользователя вместе с текущей минутой, это будет сделано в приложении формы Windows, а затем повторю тот же код на веб-сайте, и когда пользователи попытаются войти в систему, им будет задан запрос на этот код аутентификации, если он будет соответствовать им.Сгенерировать код с использованием имени пользователя и текущего времени

Я искал, но не смог найти способ генерации 4-значного кода из hashed string

public static string HashSHA512String(string Username, string Password) 
    { 
     string AllString = Username + Password + DateTime.UtcNow.Minute; 
     if (string.IsNullOrEmpty(AllString)) throw new ArgumentNullException(); 
     byte[] buffer = System.Text.Encoding.UTF8.GetBytes(AllString); 
     buffer = System.Security.Cryptography.SHA512Managed.Create().ComputeHash(buffer); 
     return System.Convert.ToBase64String(buffer).Substring(0, 86); 
    } 

Это то, что я сделал до сих пор. Я хочу превратить эту длинную строку в четырехзначный код. Не могли бы вы рассказать мне, что я должен сделать, чтобы сгенерировать этот 4-значный код?

+3

Что вы подразумеваете под 4-битным кодом? Вы ищете хэш, который может принимать только значения от 0 до 15? –

+0

что я имею в виду, например, имея 9210 вместо этой очень длинной строки, которая производится – user3679986

+0

. Тогда я думаю, вы имеете в виду 4-байтный (32-разрядный) код. –

ответ

0

Изменить код следующим образом ...

public static int HashSHA512String(string Username, string Password) 
{ 
    const int RandomFactor = 27; // Added this to make the code appear more "random". 
    string AllString = Username + Password + DateTime.UtcNow; 
    if (string.IsNullOrEmpty(AllString)) throw new ArgumentNullException(); 
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(AllString); 
    buffer = System.Security.Cryptography.SHA512Managed.Create().ComputeHash(buffer); 
    int code = 0; 
    for (var i = 0; i < buffer.Length; i++) 
    { 
     code += buffer[i] * RandomFactor; 
     code = code % 10000; 
    } 

    return code; 
} 

Это возвращает вам код, который находится в диапазоне от 0 и 9999. Вы можете создать нулевую левую проложенную строку из этого кода.

Я бы рекомендовал использовать полную дату, а не только минуту для вашего хэша, чтобы дать вам рандомизированные результаты, возможно, с некоторой солью там.

Если вы хотите, чтобы преобразовать Int, который возвращается из выше строки кода из четырех цифр, используйте этот ...

public static string PadInt(int value) 
{ 
    var output = value.ToString(); 
    while (output.Length < 4) 
    { 
     output = "0" + output; 
    } 

    return output; 
} 

Вы могли бы назвать это в вашем методе Hashing выше, а затем просто вернуть string, а не int.

+0

Возможно, вы захотите обернуть это для цикла в ['unchecked'] (https://msdn.microsoft.com/en-us/library/ a569z7k8.aspx), чтобы быть в безопасности от исключения переполнения, его следует отключить по умолчанию, но на всякий случай, когда компилятор сам установил флажок, код все равно будет работать. –

+0

Я исправлю это, чтобы принять это во внимание. Спасибо :) – ManoDestra

+1

Спасибо большое, это именно то, что я хотел :) – user3679986

Смежные вопросы