27 Aralık 2020 Pazar

Deadlock Analiz #1

 



Oluşan sorunların nedenlerini analiz ederken sonradan oluşabilecek sorunları önleyebiliriz.

* Deadlock oturumları
* Deadlock oluşturan kaynaklar
* Sessionlar tarafından yürütülen sorgular.


Kilitlenme Bilgilerinin Toplanması 

Bu bilgileri toplamanın 4 yolu vardır.

1-1222 flag izlemesinin ayarlanması
2-1204 flag izlemesinin ayarlanması
3-İzleme olaylarının kullanılması
4-Genişletilmiş olayların kullanılması


İzleme bayrakları kilitlenme durumlarının oluşmasında belirli SQL Server davranışlarının özelleştirmesi için kullanılır. Ancak bu bilgi edinme eski bir yöntem olmuştur. SQL Server 2008 den beri kullanılan örnekte; system_health adın bir genişletilmiş olay oturumu vardır. Oturum otomatik olarak çalışır ve olaylarından birini varsayılan olarak toplar. Bu kilitlenme bilgilerine anında erişmek için en kolay yoldur.

System_health sadece anlık olayları için kullanılabiliyor. Verileri yakalamak için ring_buffer kullanıldığı için bir kilitlenme yaşandıktan hemen sonra bu parametreye bakıyorsanız bilgilerin eksik olduğunu görebileceksiniz. Daha uzun süreli bilgi toplamak gerekli olursa mümkün olduğunda çok olay toplamamız gerekiyor.  Genişletilmiş olaylar kilitlenme bilgilerini toplamak için birkaç yol sağlamaktadır. Bu en iyi yollardan biridir. 

1- Lock_deadlock: Bir kilitlenme olayı hakkkında temel bilgileri görüntülenmesini sağlar.

2-Lock_deadlock_chain: bir kilitlenmedeki her oturumda bilgi alır.

3-Xml_deadlock_report : Kilitlenme nedeniyle beraber XML şeklinde grafik sağlar.

Temel kilitlenme bilgileri için en kolay yol xml_deadlock_report görünüyor. Aynı zamanda Lock_deadlock_chain kullanmak yardımcı olacaktır.

Kilitlenme grafiğini Management Studioda açabiliriz. XMLde de arama yapabiliriz.  XML kilitlenme için neredeyse bir yürütme planı gibi çalışır.

Kilitlenme bilgisini oluşturan iki izleme bayrağı farklı veriler oluşturmak için tek tek veya birlikte kullanılabilir.

Genellikle biri kullanılır bunu sebebi ise çok fazla veri olmasındandır.  SQL Server hata günlüğünü, izleme bayraklarını, toplanan verileri, kilitlenme olaylarını bir günlük dosyasına yazar. İzleme bayrağı 1222 kilitlenme olayları ile ilgili olarak ayrıntılı bilgiler çıkarır. Bilgileri kaynağa göre sıralar ve süreçler hakkında daha fazla bilgi sağlar.

İzleme bayrağı1204 ise; kilitlenme nedenini analiz etmemize yardımcı olarak ayrıntılı kilitlenme bilgileri sağlar. Kilitlenmeye dahil olan tüm düğümleri ayrıntılı olarak çıkarır.

DBCC TRACEON izleme bayraklarını açmak ve etkileştirmek için kullanılır. Açılan izleme bayrakları DBCC TRACEOFF  deyimi kullanılana kadar devrede kalır. Eğer sunucu yeniden başlatılırsa bu izleme bayrakları silinecektir. 

DBCC TRACESTATUS deyimini kullanarak izleme bayraklarının durumunu belirleyebiliriz.


DBCC TRACEON (1222, -1);
DBCC TRACEON (1204, -1);


SQL Server Management Studio üzerinden izleme bayraklarının ayarlanması başlangıçta yapılabilir. 


19 Aralık 2020 Cumartesi

SQL Server Deadlock #1


 

Deadlock birincil nedenlerinden biri performans düşüklüğü gelir. iki veya daha fazla işlem arasında bir kilitlenme meydana geldiğinde SQL Server sadece bir işleme izin verir. Daha sonra diğer işlem(ler) için tamamlamak , sonlandırmak yada geri almak için bir hata döndürür. Kullanıcıya bu konuda yeniden denemesini sağlatmak yada işlemi sonlandırmak.

Kilitlenme, iki işlemin birbiri tarafından engellendiği özel bir engelleme senaryosudur. Her süreç kendi kaynaklarını elinde tutarak diğer işlem tarafında kilitlenen bir kaynağa erişmeye çalışır.

SQL Server işlemin geri alınması maliyetini değerlendirerek oturumu kilitleme kurbanı olarak belirler. Oturumdaki en düşük olanı seçer.  Bu alanda bir kontrol uygulanabilir. Bağlantı düşük olarak seçilerek bu işlemi yönetebiliriz.

SET DEADLOCK_PRIORITY LOW;

SET komutu yürüterek bağlantının kilitlenme önceliğini normal değere atayabiliriz.

SET DEADLOCK_PRIORITY NORMAL;


Deadlock tespiti için Error Handling Kullanmak 

SQL Server kurban olarak bir oturumu seçtiğinde hata numarası ile bir hata oluşturur. Bu hata numarasını ve hatayı bulabilmek için TRY - CATCH yapısını kullanabiliriz.

Hata işleyicisinde kilitlenme durumda hatayı uygulamaya döndürmeden önce T-SQL içerisinde birkaç kez yeniden başlatmayı deneyelim. 

DECLARE @retry AS TINYINT = 1,
      @retrymax AS TINYINT = 2,
      @retrycount AS TINYINT = 0;
WHILE @retry = 1
      AND @retrycount <= @retrymax
      BEGIN

            SET @retry = 0;
                   

            BEGIN TRY
                  UPDATE HumanResources.Employee
                  SET LoginID = '54321'
                  WHERE BusinessEntityID = 100;

            END TRY
            BEGIN CATCH

                  IF (ERROR_NUMBER() = 1205)
                        BEGIN
                              SET @retrycount = @retrycount + 1;
                              SET @retry = 1;
                        END

            END CATCH
END

Try, Catch blogu içerisinde hata numrasını bulabiliriz. Kilitlenme olup olmadığını kontrol edebilmek içinse, ERROR_NUMBER()  fonksiyonunu kullanabiliriz Kilitlenme ile karşılaşıldığında belirli bir sayıda işlemi yeniden başlatırız. Arasıra ortaya çıkan kilitlenmelerde kısa çözüm sağlayacaktır.  En iyi yaklaşım ise kilitlenmenin ana nedenini bulmaktır.

12 Aralık 2020 Cumartesi

Hashing için Tuzlama

 Düz hashing ile temel sorun belirli bir çıktının karşılık gelen girdiye eşlenmesidir. Önceden hesaplanabilir ve saklanabilir. Bu soruna kolay bir çözüm tuzlamadır. Eklenen rastgele bir dizenin hashing işleminden önce veriler eklenir böylece çıktı önceden hesaplanmış eşlemeler kullanılarak geriye döndürülemez. Sözlüğe dayalı saldırılar dahil olmak üzere hash üzerindeki tüm saldırılar istinalar dışında etkisiz hale getirilir. 


Tuz değerini daha uzun tutmak her mesaj için benzersiz bir tuz değeri kullanmak önemlidir.


Saldırgan kaba kuvvet saldırısı düzenler ve arama tablolarını kullanarak saldırı sürecini ileri almasını sağlar.  Kaba kuvvet saldırısı yapılabilen anahtar germe diye bilinen bir teknik vardır.  Bu işlem o kadar işi yavaşlatacak ki, hash'i kırmak en azından bir saldırgan bakış açısından birkaç ay onu kırmamak kötü sonuçları beraberinde getirecektir.


Parola Tabanlı Anahtar Türetme İşlevi 2 (PBKDF2) RSA  nin bir parçası olan anahtar türetme işlevidir. PKCS serisinin PKCS # sürümü 2.yayınlanmış,RFC 2898 olarak üretilen bir önceki standart olan PBKDF1 in yerini almıştır.  160 bit uzunluğa kadar türetilmiş anahtarlardır.


PBKDF2 algoritması benzer anahtar genişletme içi  standart algoritmalar bulunur. Girdiyi hash eder bir tuz değeri ile birlikte şifre veya verileri türetilmiş bir anahtar oluşturur ve bu işlemi bir çok kez tekrar eder.


Hashing , Brute-Force saldırıları bir saldırgan için zaman alıcı ve sinir bozucu hale getirir. Önerilen yineleme sayısı 1000 dir. Yineleme sayısı ne kadar yüksekse o kadar daha fazla CPU gücüne ve zamana ihtiyacı olması gerekir. Ancak bu işlemlerle verilerimizi daha güvenli hale getirebileceğiz. 


Tuzlama (Salt) ve PBKDF2 kullanarak bir SHA-1 hash oluşturulan kod aşağıda örnek amacıyla paylaşılmıştır. Rfc2898DeriveBytes sınıfı SHA-1 tabanlıdır. Bunun sonucunda elde edilen karma değer örnekteki gibi SHA256 değil, SHA-1 dir.


string data = "hello";
byte[] salt = new Byte[32];
using (var provider = new RNGCryptoServiceProvider())
{
provider.GetBytes(salt);
}
Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(data, salt);
pbkdf2.IterationCount = 1000;
byte[] hash = pbkdf2.GetBytes(32);
string hashString = Convert.ToBase64String(hash);
 
 


Bu adımları nasıl kullanabileceğimiz için küçük bir alıştırma; Kullanıcı tablomuzda user_id ve password sütunlarına sahip olduğumuzu düşünelim bir sütun daha ekleyelim. Salt ve Store_hashString. Tuz değerini olduğu gibi saklayabiliriz. Bayt dizisi şeklinde, Onu bsa64 olarak kodlayabiliriz.

Kullanıcı yeniden oturum açmak istediğinde kullanıcı kimlik bilgilerini nasıl doğrulayacağının yolunu bulacağız.


string password = String.Empty; // Placeholder, şifreyi databaseden alıyoruz.
string saltString = String.Empty; // Placeholder, salt değeri databaseden alıyoruz.
string userEnteredPassword = String.Empty; // User input
var pbkdf2 = new Rfc2898DeriveBytes(userEnteredPassword, Convert.FromBase64String(saltString));
pbkdf2.IterationCount = 1000;
byte[] computedHash = pbkdf2.GetBytes(32);
bool isAuthenticCredential = password.Equals(
Convert.ToBase64String(computedHash),
StringComparison.Ordinal);


Not:

Veritabanındaki verileri şifrelemek için anahtara ihtiyacınız olacaktır. Bu anahtarı kesinlikle veritabanında saklamayın. Eğer Veritabanı SQL Injection v.b tehlikelere girerse saldırgan anahtarı ele geçirecek ve veritabanındaki şifrelerinin çözülmesi mümkün olacaktır. 


6 Aralık 2020 Pazar

Güvenli Deploma için Şifre Karıştırma

 


    Şifreleme ve Hashing arasında önemli fark hashing ile çıktının tersine çevrilememesidir. Şifrelenmiş verilerin şifresi aynı anahtar kullanılarak çözülür. Simetrik şifreleme veya asimetril şifreleme durumlarında farklı anahtar kullanılır. Hashing uygulanmış veriler sonsuz kadar karma kalır. 

Bir algoritma kullanarak 123456 için "dünya barışı" karıştırırsak ve karma veriyi depolama alanımızda saklarsak buna gerek kalmıyor. Kötü niyetli birinin 123456 dan saklanmış veri olan "dünya barışı" çıkarabilmesi için endişelenebiliriz.  Algoritma aracılıyla "dünya barışı" dan çevirdiğinizde 123456 verilecek. Hashing kullanımını burada devreye almayı amaçlıyoruz. Kullanıcı sistemimize giriş yaptığında giriş için kullandığı şifre hassas bilgi içerdiği için  girilen parolayı hashlemek, hash için daha önceden kaydettiğimiz sonuçla karşılaştırma işlemini yapmak. Karma oluşturma şifre gibi beklemedeki hassas verileri korumak için ideal bir teknik.

Not: Hashinh güvenlik gereksinimleri için tüm verileri üzerinde kullanılabilecek bir yöntem maalesef değildir. Kredi kartlarına hashing uygulayamayız, Kredi kartları hash den kurtarılamaz.


Hashing için birden fazla algoritma mevcuttur. MD5 mesaj özeti algoritması yaygın olarak kullanılan 128 bitlik (16 baytılı) karma değer üreten algoritmadır. Kriptografi dünyasında öncülük eden birkaç zayıflığı olan Güvenlik Karma Algoritması (SHA-1) güvenlik açıkları tespit edildi. Şu anda önerilen SHA-2,SHA-3 algoritmaları.


.NET Frameworde kullanılan System.Security.Crytography alanındaki sınıflarada karşılık gelen MD5,SHA1,SHA256, SHA384, SHA512 algoritma ailesi, 256,384,512 bitlik aile ise SHA-2 ailesine aittir.


"Supercalifragilisticexpialidocious" datayı Sha256 da oluşturma için küçük  bir kod.


string data = "Supercalifragilisticexpialidocious";
SHA256 hasher = SHA256.Create();
byte[] hash = hasher.ComputeHash(Encoding.UTF8.GetBytes(data));
string hashString = BitConverter.ToString(hash).Replace("-", "").ToLower();
  

Hash kod oluşturmak son derece basittir. ComputeHash yöntemiyle yapılan bir çağrım  sonucu verecektir. BitConverter sınıfı ile bayt dizisini 16 lık dize gösterimine yardımcı olacaktır.

Hash Output:

94730f57d7e41018d963d92fbf11618dce8274ca2c1bf72274e0285a6013c17b
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
 
 


Hash kaba kuvvet kullanarak saldırabiliriz. Anında a değerini hesaplayabiliriz. Eşleme yoksa b ile devam edebiliriz. Z ye geldiğimizde aa ile başlarız ve bu şekilde devam edebiliriz. Bunun gerçekleşmesi biraz zaman ve CPU gücü alacaktır.

Bir sözcükteki sözcükler gibi karmayı önceden hesaplamak mümkündür. Karma girildiğinde sadece arama meselesine dönüşür. Hashing orjinal şifre saklama için iyi br seçim gibi görünür.  Kötü niyetli bir kişi string türünden şifreyi çevrim için araçlarla kolay biçimde elde edebilir.

Bir sonraki makalede hash ek Tuzlama işlemine yer vereceğiz.



14 Nisan 2019 Pazar

ASP.Net Web API TFA Uygulaması



Merhaba,

Google Authenticator tarafından oluşturulan TOTP kodları kullanarak ASP.NET  Web Api si ile istek başına TFA kullanımından kısaca bahsedeceğim.

ASP.NET Web API normalde bir faktöred dayalı kimlik doğrulama ile çalışılır. HTTP kimlik doğrulama üstbilgisi temel düzeninde gönderilen bir şifrenin bilgi faktörüdür. 

Birkaç önemli API için çağrılar, ASP.NET Web API, güvenliği iki faktörlü güvenliğe yükseltir ve TOTP kodunu ek olarak talep eder. 

Transfers Controller sınıfındaki HTTP POST işleyen eylem yöntemi, TFA kullanarak güvenceye almaya çalışacağımız şeydir. Eylem yöntemlerini seçmeli olarak güvenceye almamız gerekiyor.  TFA'yı uygulamak için Yetkilendirme filtresini alt sınıfa seçeriz. Bu filtre, TOTP kodunun istemci uygulaması tarafından özel bir HTTP isteği başlığında adının gönderilmesini bekler.  Tüm API çağrıları için parolanın bilgi faktörü gerekir. Dolayısıyla, ilgili kimlik doğrulama bir mesaj işleyicide mantık uygulanacak.

Aşağıda, istek başına TFA sabitini uygulamak için gereken adımlar vardır.

Transfers Controller sınıfının HTTP POST eylem yöntemi:



public class BasicAuthenticationHandler : DelegatingHandler
{

 private const string SCHEME = "Basic";
 protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
 var headers = request.Headers;
  if (headers.Authorization != null && SCHEME.Equals(headers.Authorization.Scheme))
  {
    string credentials = Encoding.UTF8.GetString(Convert.FromBase64String(                                                                                                                  headers.Authorization.Parameter));
    string[] parts = credentials.Split(':');
    string userId = parts[0].Trim();
    string password = parts[1].Trim();
     // TODO - Kullanıcı id ve şifrenin burada saklandığının doğrulanması.

if (true)
{
   var claims = new List<Claim>
{
  new Claim(ClaimTypes.Name, userId)
};


var principal = new ClaimsPrincipal(new[] {new ClaimsIdentity(claims, SCHEME) });

Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
   HttpContext.Current.User = principal;
}
}

 var response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
  response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue(SCHEME));
}
  return response;
}
}





Mesaj işleyicileri listesine eklemek; 
App_Start klasörü altındaki WebApiConfig.cs,  config.MessageHandlers.Add

(new BasicAuthenticationHandler ());



  • HttpRequestMessage sınıfına bir uzantı yöntemi ekleyeceğiz,
  • Helpers klasöründe RequestHelper adlı yeni bir statik sınıf oluşturacağız.
  • Sınıfı oluşturmadan önce klasörü oluşturacağız,
  • TOTP kodu X-TOTP'de mevcutsa, yöntem onu alır.
  • Sonra statik bir yöntem GetPastCurrentFutureOtp çağırır Son 30 saniyeye karşılık gelen Totp sınıfında bloklanan üç TOTP kodunu döndürülür , şuanki  TOTP ve bir sonraki 30 saniyelik bloğa karşılık gelen ikinci TOTP bloklarına uyanlar alınır.

Örnek aşağıdaki gibi olacaktır.

Bu kod çalıştırıldığında saatin 08:35:07 AM olduğunu kabul ettiğimizde bize aşağıdaki gibi 3 TOTP kodu dönecektir.

  1. TOTP zaman aralığındaki 08:34:30 AM–08:34:59 AM (Geçmiş).
  2. TOTP zaman aralığındaki 08:35:00 AM–08:35:29 AM (Şuanki).
  3. TOTP zaman aralığındaki 08:35:30 AM–08:35:59 AM (Gelecek)  


RequestHelper Sınıfını eklemek;

public static class RequestHelper
{
 public static bool HasValidTotp(this HttpRequestMessage request, string key)
{
 if (request.Headers.Contains("X-TOTP"))
{
   string totp = request.Headers.GetValues("X-TOTP").First();
   // Geçmiş , şimdiki ve gelecekteki TOTP kontrolü
 
  if (Totp.GetPastCurrentFutureOtp(key).Any(p => p.Equals(totp)))
   return true;
}
   return false;
}
}
  


Gelen TOTP gelen 3 şifreden biri ile eşleşiyorsa kodun doğruluğu kabul edilir.  Buradaki 3 OTP den birinin olmasının nedeni ise Sunucudaki saatin, mobil telefondaki saatin, kodun çalıştığı yerdeki saatin Google Authenticator tarafından oluşturulmasıdır.


Infrastructure  klasöründe yeni bir Totp adında sınıf oluşturup, Listede sadece GetPastCurrentFutureOtp  fonksiyonu yer alsın.



public class Totp
{
public static IList<string> GetPastCurrentFutureOtp(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);
var otps = new List<string>();
otps.Add(GetHotp(base32EncodedSecret, counter - 1)); // Bir önceki  OTP
otps.Add(GetHotp(base32EncodedSecret, counter)); // Şuanki OTP
otps.Add(GetHotp(base32EncodedSecret, counter + 1)); // Bir sonraki OTP
return otps;
}
private static string GetHotp(string base32EncodedSecret, long counter)
{
byte[] message = BitConverter.GetBytes(counter).Reverse().ToArray(); 
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;
return hotp.ToString().PadLeft(6, '0'); 

}
}



Daha önceden kullanılan delegasyon işleyicisi şifrenin bilgi faktörüne dayanan doğrulanmış kimliğini oluşturur.

Kullanıcı adı alınması için IsAuthorized yöntemini override ederek, messagehandler  Thread.CurrentPrincipal üzerinden kullanalım.

Kullanıcı için örnekte hardcoded şifre girişi yapılmıştı. Bunun yerine otomatik üretiken şifre kullanılması daha uygun olur. 

HasValidTotp uzantısını kullanarak, gelen TOTP'yi doğrulayın ve geri dönün, Gelen TOTP geçerliyse geçerlidir. Aksi takdirde, false döndürün.

Burada false döndürmek, 401 yanıt statüsüne neden olur ( Yetkisiz.)
401 ile birlikte, TOTP’nin gerektirdiğini belirten bir sebep ifadesi gönderin.

HandleUnauthorizedRequest yönteminin geçersiz kılınması sağlamak.

Two Factor Attribute sınıfı Infrastructure klasörü altında yaratalım.



public class TwoFactorAttribute : AuthorizeAttribute
{

protected override bool IsAuthorized(HttpActionContext context)
{

  IIdentity identity = Thread.CurrentPrincipal.Identity;
  if (identity.IsAuthenticated && !String.IsNullOrWhiteSpace(identity.Name))
{

string key = "JBSWY3DPEHPK3PXP";
if (context.Request.HasValidTotp(key))
{
 return true;
}
}
 return false;
}

protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{

actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
ReasonPhrase = "TOTP code required"
}; } }
  



TransfersController adı ile yeni bir  Web API denetleyicisi oluşturup, İşlem sonrasında Two Factor filtresini uygularız. 

İstek sonucunda geçerli bir TOTP içeren X-TOTP başlığı içerdiğinden emin olmamız lazım, Değilse 401 izinsiz durum kodu geri döndürürüz.

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.





22 Temmuz 2018 Pazar

Şifreli E-Posta


    



 İnternet üzerinden e-posta gönderildiği için veri paketleriniz yakalanacak ve okunacaktır. Gizli bilgi içeren maillerinizi şifreleyebilirsiniz.

E-mailleri şifreleme için çoklu protoller vardır. Bunların içerisinde iki önemli olandan bahsetmek istersek;

• Secure Multipurpose Internet Mail Extension (S/MIME)
• Pretty Good Privacy (PGP)

Secure Multipurpose Internet Mail Extension  S/MIME güvenli sürümüdür. E-posta mesajlarının içerisine nesneleri gömer.

Kullanılan en yaygın ve desteklenen standart güvenli e-posta iletişimi PKCS #7  kullanır.

S/MIME ile bilrlikte gelir, popüler web tarayıcıları ve diğer mesajlaşma ürünü satıcıları tarafından da onaylanmıştır.

Asimetrik + Simetrik şifreleme yapan, oldukça iyi gizlilik yapabilen ücretsiz e-posta şifreleme sistemidir.  (PGP)


E-mail gönderildiğinde, döküman açık anahtar ile ve bir session key şifrelenir.

Session key oluşturmak için kullanılan tek kullanımlık rastgele bir sayıdır, Session key ortak anahtar ile şifrelenir ve şifre metni ile gönderilir.

Mesaj alındığında özel anahtar session key çıkarabilmek için kullanılır. Session key ve private key daha sonra şifre metnin şifresini çözmek için kullanılır.



12 Mayıs 2018 Cumartesi

Şifreleme Algoritmaları - 3





HASH Algoritma


* Simetrik ve asimetrik algoritmadan farklı olan bu algoritma karma işlevi ile tek yönlü şifreleme algoritmasını ifade eder.

* Bu demek oluyor ki bir şeyden sonra bu yöntemle şifrelenmiş ve şifresi çözülemez. Örneğin karma işlevli algoritma diskte saklanan parolayı ve digital imzayı şifrelemek için kullanılır.

* Herhangi bir zamanda bir şifre girilir girilen şifre ile aynı karma algoritma hesabı yapılır.

* Karşılaştırıldığında diskte saklanan parolanınkarma değeridir.

* İki karşılaştırma varsa kullanıcı iki parola yazmış olmalıdır.

* Bu özellik bir hacker ın yapabileceği şifrelerin okunabilir biçimde saklanmasını önler.

11 Şubat 2018 Pazar

Şifreleme Algoritmaları - 2



Asimetrik Şifreleme:

    Açık Anahtar şifrelemesi olarak bilinen asimetrik şifreleme iki ilgili anahtarı matematiksel olarak kullanılarak şifreleme işlemi yapılır.

Bir şifreleme anahtarı datayı şifrelemek için kullanılırken bir diğeri şifreyi çözmek için kullanılır.

Simetrik algoritmadan farklı olarak Gönderen ve Alıcıda bulunan bir yada birden fazla gizli anahtar değişimiden bu yöntem ile
güvenli başlangıç gerektirmez.

Genel anahtarlar birine yada birden fazla kişiye gönderilebilir veya digital sertifika kullanılabilir.

Secure Sockets Layer (SSL)/Transport Layer Security (TLS) ve
Pretty Good Privacy (PGP) tümü asimetrik anahtarlar kullanılır.

Popüler asimetrik şifreleme protokolleri  Diffie-Hellman ve RSA.

Örnek; 
İş ortağınızın size veri göndermesini isterseniz, Asimetrik şifrelemeye başlamk için iş ortağınıza açık anahtar gönderirsiniz.

İş ortağınızı datayı gönderilen anahtar ile  şifreleyecek ve size şifreli olarak gönderecektir.

Mesajdaki şifreyi çözmek için özel anahtarınızı kullanacaksınız.

Genel anahtar başkasının eline düşerse o kişi hala mesajın şifresini çözemez. Şifrelenmiş bir mesajın şifresinin çözülebilmesi için
özel anahtara ihtiyacını vardır.


4 Şubat 2018 Pazar

Şifreleme Algoritmaları-1



Şifreleme Algoritmaları-1


Şifreleme algoritmaları 3 sınıfa ayrılır.
1-Symmetric,
2-Asymmetric ve
3-Hash Function


Verileri Korumak için Şifre Kullanımı:

Şifreleme, verileri başka bir tarafından okunamayan bir biçime dönüştürme işlemidir.
Bir kullanıcı dosyayı şifrelendiğinde şifreli dosya diskte saklanır.
Şifre çözme işlemi ise şifreli formattan orginal formata dönüştürme işlemidir.


Simetrik Şifrelemeye bakış;

Simetrik şifreleme, verileri şifrelemek ve şifre çözmek için tek bir anahtar kullanır.

Bu nedenle aynı zamanda gizli anahtar, tek anahtarlı, paylaşımlı anahtar ve özel anahtar şifrelemesi olarak da bilinir.

Simetrik anahtar algoritmasını kullanmak için gizli anahtar değişiminin gönderen ve alıcı arasından değiştirilmesi gerekir.

Simetrik anahtar şifreleyicileri, blok şifrelere ve akış şifrelemelerine ayrılabilir.

Bir blok şifre bir blok düz metin ve bir anahtar alır ve daha sonra aynı boyutta bir şifre metni bloğu çıkarır.

İki popüler blok şifreleyici  DES (Data Encryption Standard ) ve  AES (dvanced
Encryption Standard ) bu şifreleyiciler ABD hükümeti tarafından şifreleme standartı olarak belirlenmiştir.

1976 yılında ABD Ulusal Standartlar Bürosu veri şifreleme standartı FIPS (Federal Information Processing Standard ) 

56 bitlik simetrik anahtar algoritması kullanımına dayanır.


Brute force ataklarda DES, nispeten küçük bir 56 bitlik anahtar boyutuna dayandığından,  yeni bir blok şifreleme algoritması geliştirmek yerine, Triple DES (3DES) 3 lü bağımsız anahtar yaratılmış.

3DES  DES şifrelemeye göre daha popüler geniş bir kullanım alanına sahiptir. ATM güvenliğinde, uzaktan erişim şifrelenmesinde ve e-mail güvenliğinin
şifrelenmesinde kullanılır.

DES ve 3DES  popüler olmasına rağmen yeni nesil şifreleme yöntemi gelişmiş  AES 2001 yılında duyurulmuş ve popülaritesi artmaya başlamıştır.

Bu standart 3 lü bloklar halinde şifreleme üzerine kurulmuş, (AES-128, AES-192,  AES-256) 128, 192, and 256 bits anahtar boyutuna sahip, 128 bit blok üzerindedir.

AES şifreleri kapsamlı olarak analiz edildi,  Wi-Fi Protected ile dünya çapında kullanılmaktadır. (Access 2 (WPA2) wireless encryption.)


Akış şifreleri, blok şifrelere karşıt olarak, uzun metrajlı bir materyal akışı sağlar, bit eşlem ya da karakterle oluşan karakteri düz metinle birleştirir.

RC4, hem Güvenli Yuva Katmanı (SSL) hem de Kablolu Eşdeğerde kullanılan, yaygın olarak kullanılan bir akış şifresidir (WEP)

RC4 basit ve hızıyla bilinmesine rağmen, anahtar akışı yok edilmez, rastgele olmayan veya ilgili anahtarlar kullanılır veya tek bir anahtar akışı iki kez kullanılır.

25 Kasım 2012 Pazar

Parasal Aktarım Mekanizması

   Kısa vadeli faiz oranlarının para politikası aracı olarak kullanan Merkez Bankaları faiz kararları ekonomiyi temel alarak dört kanal aracılığıyla etkilemektedir.