SHA1 (Secure Hash Algorithm)

DarkCod3r

Key&RC4 Coder
Katılım
8 Ağu 2007
Mesajlar
1,683
Reaction score
0
Puanları
36
Yaş
36
Konum
Artık YENİ bi SOLUK
Veri üzerinde yapılacak çok küçük bir değişiklik, çok büyük ve önceden kestirilemez değişikliklere yol açar. Bu yüzden SHA1 oldukça güvenli olarak tanımlanmaktadır. NSA(National Security Agency[Ulusal Güvenlik Ajansı]) tarafından tasarlanmış, NIST(National Institute of Standards and Technology[Ulusal Standartlar ve Teknoloji Enstitüsü]) tarafından yayınlanmıştır. 264 bitlik bir bilgiden 160 bitlik bir mesaj çıkartabilmektedir.

Algoritmanın orjinali 1993 yılında Secure Hash Standart, FIPS PUB 180 ismiyle ilk defa özellikleri tanımlanmıştır. Bu versiyonu genellike SHA-0 olarak anılmaktadır. Kısa bir süre sonra NSA tarafından geri alınmış, yayımlanan özellikleri tekrardan gözden geçirilmiş ve 1995 yılında FIPS PUB 180-1 ismiyle yeniden yayımlanmıştır. Bu versiyonu da daha çok SHA-1 olarak anılmaktadır. NSA tarafından iki algoritma arasındaki fark kriptografik güvenliği tehlikeye atan bir akış olarak açıklanmıştı. Bunun dışında, NSA tarafından ek bir açıklama yapılmamıştır. Çok sonra, 1998 yılındaki bir kriptoloji konferansında iki fransız araştırmacı F. Chabaud and A. Joux SHA-0 üzerinde bir saldırı örneği sundular. Aynı saldırı SHA-1 üzerinde uygulanamamıştır. Bunun sebebi NSA’nın belirttiği akış olduğu söylenmiştir. Daha sonra bir çok kriptografi topluluğu tarafından detaylı olarak incelenen SHA-1 üzerinde herhangi bir açık noktaya rastlanamamıştır.

Microsoft .NET Framework’ te SHA1, kendisi gibi soyut bir sınıf olan HashAlgoritm sınıfından türeyen SHA1 sınıfı ile tanımlanmıştır. SHA1CryptoServiceProvider yönetilmeyen, SHA1Managed ise yönetilen SHA1 algoritması implementasyonu içerir. Microsoft .NET Framework’ te, SHA1 algoritması için hash boyutu 160 bittir.
SHA1CryptoServiceProvider ve SHA1Managed sınıfları SHA1 soyut sınıfından türemektedirler. SHA1 soyut sınıfının erişilebilir özellikleri şu şekilde tanımlanır:
CanReuseTransform, şu an ki dönüşüm tekrar kullanılıp kullanılmayacağını belirtir,varsayılan değeri true’dur. CanTransformMultipleBlocks, aynı anda bir çok veri bloğunun dönüştürülüp dönüştürülemeyeceğini belirtir, varsayılan değeri true’dur. Hash, hesaplanan hash değerini verir. HashSize, hesaplanan hash değerinin bit olarak büyüklüğünü gösterir. Varsayılan değeri 160 bittir. InputBlockSize, kullanılan veri bloğunun bit olarak büyüklüğünü gösterir. Varsayılan değeri 1 bittir. OutputBlockSize, algoritma sonunda oluşacak veri bloğunun bit olarak büyüklüğünü gösterir. Varsayılan değeri 1 bittir.Bu sınıfın erişilebilir metotları ise şunlardır:
Clear, SHA1 algoritması tarafından kullanılan kaynakları sisteme geri verir. ComputeHash, kullanılan veri bloğu için hash değerini hesaplar. Create, SHA1 algoritmasını gerçekleştirecek bir nesne oluşturur. Equals, iki nesnenin birbirine eşit olup olmadığını test eder. GetHashCode, bellekteki o nesneye özgü bir hash kodu oluşturur. GetType, bu nesnenin tipini verir. Initialize, SHA1 nesnesinin ilk değerlerini ayarlar. ToString, şu an ki nesneyi ifade eden bir metin oluşturur. TransformBlock, belirtilen veri bloğundaki belirtilen alan için hash değerini hesaplar ve belirtilen sonuç veri bloğunun belirtilen alanına hesaplanan bu hash değerini kopyalar. TransformFinalBlock, belirtilen byte dizisindeki belirtilen alan için hash değerini hesaplar.SHA1Managed, SHA1 sınıfından türer ve SHA1 algoritmasının yönetilen implementasyonu içerir. SHA1CryptoServiceProvider ile aynı özelliklere ve metotlara sahiptir. Aralarındaki fark yönetimsel olup olmamalarıdır. Ayrıca SHA1CryptoServiceProvider mühürlü bir sınıftır. Mühürlü sınıf, hiç bir sınıfın kendisinden türetilemeyeceğini ifade eder. Bu iki sınıfın erişebilir özellikleri şunlardır:
CanReuseTransform, şu an ki dönüşüm tekrar kullanılıp kullanılmayacağını belirtir,varsayılan değeri true’dur. CanTransformMultipleBlocks, aynı anda bir çok veri bloğunun dönüştürülüp dönüştürülemeyeceğini belirtir, varsayılan değeri true’dur. Hash, hesaplanan hash değerini verir. HashSize, hesaplanan hash değerinin bit olarak büyüklüğünü gösterir. Varsayılan değeri 160 bittir. InputBlockSize, kullanılan veri bloğunun bit olarak büyüklüğünü gösterir. Varsayılan değeri 1 bittir. OutputBlockSize, algoritma sonunda oluşacak veri bloğunun bit olarak büyüklüğünü gösterir. Varsayılan değeri 1 bittir.Bu iki sınıfın erişilebilir metotları ise şunlardır:
Clear, SHA1 algoritması tarafından kullanılan kaynakları sisteme geri verir. ComputeHash, kullanılan veri bloğu için hash değerini hesaplar. Create, SHA1 algoritmasını gerçekleştirecek bir nesne oluşturur. Equals, iki nesnenin birbirine eşit olup olmadığını test eder. GetHashCode, bellekteki o nesneye özgü bir hash kodu oluşturur. GetType, bu nesnenin tipini verir. Initialize, SHA1 nesnesinin ilk değerlerini ayarlar. ToString, şu an ki nesneyi ifade eden bir metin oluşturur. TransformBlock, belirtilen veri bloğundaki belirtilen alan için hash değerini hesaplar ve belirtilen sonuç veri bloğunun belirtilen alanına hesaplanan bu hash değerini kopyalar. TransformFinalBlock, belirtilen byte dizisindeki belirtilen alan için hash değerini hesaplar.SHA1 algoritması için, tabi ki de doğru olan SHA1CryptoServiceProvider yerine SHA1Managed kullanımak olacaktır. SHA1 algoritmasını gerçekleyen SHA1Managed sınıfını basit bir örnekle açıklayacağız. Ancak dikkat etmemiz gereken önemli bir nokta var. Veri üzerinde çok küçük bir değişiklik yapıyoruz ama sonuç olarak çok farklı iki hash değeri üretilmektedir. Yapılan tek değişiklik “SHA1” ’in “sHA1” şeklinde yazılmasıdır.
C#using System; using System.Text; using System.Security.Cryptography; namespace TestConsoleApplication { public class TestUygulaması { static void Main() { string stringData = "SHA1 ile çok daha büyük boyutları veri üzerinde hash işlemi yapılabilir !!"; SHA1Managed sha1 = new SHA1Managed(); sha1.Initialize(); Console.WriteLine( Encoding.UTF8.GetString( sha1.ComputeHash(Encoding.UTF8.GetBytes(stringData)))); stringData ="sHA1 ile çok daha büyük boyutları veri üzerinde hash işlemi yapılabilir !!"; Console.WriteLine( Encoding.UTF8.GetString( sha1.ComputeHash(Encoding.UTF8.GetBytes(stringData)))); Console.Read(); } } }VB.NETImports System Imports System.Text Imports System.Security.Cryptography Module TestConsoleApplication Sub Main() Dim stringData As String="SHA1 ile çok daha büyük boyutları veri üzerinde hash işlemi yapılabilir !!" Dim sha1 As New SHA1Managed sha1.Initialize() Console.WriteLine(Encoding.UTF8.GetString( _ sha1.ComputeHash(Encoding.UTF8.GetBytes(stringData)))) stringData = "sHA1 ile çok daha büyük boyutları veri üzerinde hash işlemi yapılabilir !!" Console.WriteLine(Encoding.UTF8.GetString( _ sha1.ComputeHash(Encoding.UTF8.GetBytes(stringData)))) Console.Read() End Sub End ModuleC++.NET#include "stdafx.h" #using <mscorlib.dll> using namespace System; using namespace System::Text; using namespace System::Security::Cryptography; int _tmain() { String __gc* stringData = S"SHA1 ile çok daha büyük boyutları veri üzerinde hash işlemi yapılabilir !!"; SHA1Managed __gc* sha1= __gc new SHA1Managed(); sha1->Initialize(); Console::WriteLine( Encoding::UTF8->GetString( sha1->ComputeHash( Encoding::UTF8->GetBytes(stringData)))); stringData = S"sHA1 ile çok daha büyük boyutları veri üzerinde hash işlemi yapılabilir !!"; Console::WriteLine( Encoding::UTF8->GetString( sha1->ComputeHash( Encoding::UTF8->GetBytes(stringData)))); Console::Read(); return 0; }J#package TestConsoleApplication; import System.*; import System.Text.*; import System.Security.Cryptography.*; public class TestUygulaması { public TestUygulaması() { } /** @attribute System.STAThread() */ public static void main(String[] args) { String stringData = "SHA1 ile çok daha büyük boyutları veri üzerinde hash işlemi yapılabilir !!"; SHA1Managed sha1 = new SHA1Managed(); sha1.Initialize(); Console.WriteLine( Encoding.get_UTF8().GetString( sha1.ComputeHash(Encoding.get_UTF8().GetBytes(stringData)))); stringData = "sHA1 ile çok daha büyük boyutları veri üzerinde hash işlemi yapılabilir !!"; Console.WriteLine( Encoding.get_UTF8().GetString( sha1.ComputeHash(Encoding.get_UTF8().GetBytes(stringData)))); Console.Read(); } }NIST, SHA algoritmasını değişik uzunlukta çıktı üreten başka varyasyonlarını yayımladılar. SHA’nın bu versiyonları ürettikleri çıktının boyutları ile anılmıştır: SHA-256, SHA-384, ve SHA-512. Bu versiyonları da 2001 yılında FIPS PUB 180-2 ismiyle yayımlanmıştır. SHA-1, SHA-256, SHA-384 ve SHA-512 algoritmaları Birleşik Devletlerin Federal uygulamalarında kullanılabilecek kadar güvenli olarak tanımlanmıştır.

Son Söz: SHA256 soyut sınıfı HashAlgorithm sınıfından türemiştir ve 256 bitlik anahtar kullanarak yapılır. SHA256Managed sınıfı da SHA256 soyut sınıfından türemiştir. SHA384 soyut sınıfı da HashAlgorithm sınıfından türemiştir ve 384 bitlik anahtar kullanarak yapılır. SHA384Managed sınıfı da SHA384 soyut sınıfından türemiştir. SHA512 soyut sınıfı HashAlgorithm sınıfından türemiştir ve 512 bitlik anahtar kullanarak yapılır. SHA512Managed sınıfı da SHA512 soyut sınıfından türemiştir. Bu sınıfların da tüm özellikleri ve metotları ile SHA1 sınıfı ile aynıdır. Bir sonraki makalemizde görüşünceye kadar güvende kalın...
İlgili Makaleler:
Referanslar:
Yazar : Yunus Emre ALPÖZEN
e-Posta : yunus.alpozen et msakademik.net
 
Geri
Üst