5 Ağustos 2018 Pazar

One Time Password { O T P }


   Google Authenticator uygulaması tarafından kullanılan HOTP TOTP algoritamasını kullanaraka C# da basit kod yazacağız. Makalem bir kaç bölümden oluşacak. Konuyu detaylandırmaya çalışacağım.

Gizli 80 bit üretilen HOTP kodu 6 basamaklıdır.

1-HOTP fonksiyonu iki input bekler ve  gizli anahtar ve counter gerekir.

2-BitConvert kullanılarak counter a gelen baytla alınır. Windows baytları depolama için küçük endian anlaşması kullanır. İstediğimizi almamız için biz burada işi tersine çevirmemiz gerekiyor.

3-base32 encoded edilmiş gizli anahtar decode edilir. Bu işin çıktısı aşağıdaki gibir.



4-Her bir array byte için HMAC SHA-1 yaratılabilmesi için ikinci adımda belirtilen base32-decode gizli anahtarı kullanılır.

5-Truncate the hash için RFC 4226 dan örnek alınan mantık kullanılıyor. Truncate Hash modulü gücü 6 dan 10 yükselterek HOTP nin 1 milyon olmasını sağlar.

6- Son olarak öneki sıfırlanan kodun 6 basamaklı olduğunda emin olacağız ve dizge olarak geri dönüş yapacağız.


public static string GetHotp(string base32EncodedSecret, long counter)
{

byte[] message = BitConverter.GetBytes(counter).Reverse().ToArray(); // Assuming Intel machine (little endian)
byte[] secret = base32EncodedSecret.ToByteArray();

HMACSHA1 hmac = new HMACSHA1(secret, true);

byte[] hash = hmac.ComputeHash(message);

int offset = hash[hash.Length - 1] & 0xf;
int truncatedHash = ((hash[offset] & 0x7f) << 24) | ((hash[offset + 1] & 0xff) << 16) | ((hash[offset + 2] & 0xff) << 8) | (hash[offset + 3] & 0xff);

int hotp = truncatedHash % 1000000; // 6-digit code and hence 10 power 6, that is a million

return hotp.ToString().PadLeft(6, '0');

}

HOTP algoratiması üzerine TOTP algoritması uyguluyoruz. TOTP jenaratör kodu üretmek için  HOTP jenaratörü kodu kullanılıyor.

Sayaç parametresi kullanmıyoruz onun yerine mevcut tarih ve saatten yararlanacağız. 01 Ocak 1970 UTC gece yarısından sonra kullanılan zamana kadar geçen saniye sayısı 30'a bölünür ve en yakın tam sayıya yuvarlanır. Elde edilen sayıs HOTP mantığında girdi olarak kullanılır ve geri dönüş değeri TOTP olarak dönülür.


TOTP Generator 

public static string GetTotp(string base32EncodedSecret)

{
    DateTime epochStart = new DateTime(1970, 01, 01, 0, 0, 0, 0, DateTimeKind.Utc);
   
    long counter = (long)Math.Floor((DateTime.UtcNow - epochStart).TotalSeconds / 30);
   
    return GetHotp(base32EncodedSecret, counter);

}



Son olarak TOTP jeneratörünüzü kullanan konsol uygulamamız Ana yönetimin kodunu gösterir.

TOTP kodu her 3 saniyede yazdırılır.



Test Program 


static void Main(string[] args)
{

string secret = "JBSWY3DPEHPK3PXP";

while (true)
{

Console.WriteLine("{0} {1}", DateTime.Now, GetTotp(secret));

        Thread.Sleep(1000 * 3);

        }
}

TOTP uygulamasının çıktısını gösteren konsol uygulaması. Oluşturulan OTP kodu ekranda kalır. 30 saniye boyunca geçerlidir.  Her 30 saniyede yeni bir kod oluşur. Zamanı arttırarak kullanıcının bu OTP kodunu kullanmasını sağlayabiliriz. Sistem kendi içerisinde doğrulama yapıyorsa bunun zamanını  network erişim hızına bağlı olarak azaltabiliriz.


Bu noktada mantığımız Google Autheticator ile uyumludur.


Uygulamayı değişik amaçlarla kullanabilmek için IOS , BlackBerry, Android telefonlar ile Google Autheticator uygulamasını alarak kullanılabilir.

Yada Uygulamanın server - client modülü  yazarak karşılıklı gelen OTP nin doğru olup olmadığını kontrol ederek geçerli ve geçersiz OTP nin ayrımına giderek uygulamalar yazabiliriz.





Hiç yorum yok:

Yorum Gönder