2016-03-22 20 views
0

Kullanıcının kullanıcı adı ve parola geçerli dakika ile birlikte oluşturulacak bir kod oluşturmak için arıyorum, bu bir windows form uygulaması üzerinde yapılacaktır sonra aynı kodu tekrarlayın bir web sitesinde, ve kullanıcılar oturum açmaya çalıştığınızda, bu kimlik doğrulama kodu istenirse eşleşeceklerse istenir.Kullanıcı adı parola ve geçerli saati kullanarak bir kod oluşturun

Aradığımdan ancak 4 haneli bir kod oluşturmanın bir yolunu bulamadım karma dize

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

Bu şimdi bir 4 haneli bir kod içine uzun dize açmak istiyor dek yapmış budur. Bu 4 haneli kodu oluşturmak için ne yapmam gerektiğini söyler misiniz? aşağıdaki gibi kod Amend

+3

4 bit kodu ile ne demek istiyorsun? Sadece 0 ile 15 arasında değerler alabilen bir karma mı arıyorsunuz? –

+0

Örneğin 9210'a sahip olmak demek istiyorum, örneğin – user3679986

+0

üretilmekte olan bu çok uzun dize yerine 4-byte (32-bit) kodu kastediyorsunuz. –

cevap

0

...

Bu, Daha sonra bu koddan sıfır sol yastıklı dize oluşturabilir 0 ile 9999 bir kodu döndürür
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; 
} 

.

Tam bir tarih belirlemenizi öneririm, bunun yerine size hashunuzun rastgele sonuçlar vermesi için bir dakika yerine, muhtemelen orada da bir miktar tuz ile. Eğer bir dört basamaklı dize koduna yukarıdan döndürülen int dönüştürmek isterseniz

, bunu kullan ...

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

    return output; 
} 

Yukarıdaki senin Hashing yöntemine içinde bu çağrı ve sonra sadece geri dönebilirler string, int yerine

+0

Bir ['unchecked'] içinde döngü için sarmak isteyebilirsiniz (https://msdn.microsoft.com/en-us/library/ a569z7k8.aspx) sadece bir taşma istisnasından korunmak için varsayılan olarak işaretlenmemiş olmalı, ancak derleyici kendi kendini kontrol etmeye ayarlanmışsa, kod hala çalışmaya devam edecektir. –

+0

Bunu dikkate almak için değiştireceğim. Teşekkürler :) – ManoDestra

+1

Çok teşekkürler, tam olarak istediğim şey :) – user3679986

İlgili konular