Client ve Server Arası Veri Güvenliği (HMAC)

Halil Tuğcan Özaktaş
MagicLab
Published in
2 min readApr 8, 2022

Bu story de client’ta oluşmuş bir verimizin server’a geldiğinde işleme alınmadan önce verinin içeriğini doğrulamak için neler yapabiliriz onu inceliyor olacağız.

HMAC yöntemi kısaca şu şekildedir; client ve sunucuda bir secret key olur, client sunucuya göndermek istediği verinin bir hash’ini yaratır. Sunucuya iletilen verimizi 2 parçalı gönderilir. Parçalardan birinde iletmek isteğimiz veri veya mesaj diğer parçada ise oluşturduğumuz hash olur. Burada dikkat edilmesi gereken verimiz sunucuya açık olarak gönderiliyor ama yanında gönderdiğimiz hash ile sunucu doğrulama yapacak ve verinin içeriğinden emin olacak. Sunucu da hem client’ın, hem de kendinde olan secret key ile gelen veriden bir hash oluşturur. Sonuçta sunucuda oluşan hash ile client’in gönderdiği hash eşleşirse veri doğrulanmış olur.

HMAC Diagram

GoLang HMAC Örnek Kod

HMAC için crypto algoritması bağımlılığınız yoktur. Biz bu örnekte SHA512 kullanarak yapacağız, kullandığınız ortama göre bunu değiştirmek sizin tercihize olacaktır.

package mainimport (  "crypto/hmac"  "crypto/sha512"  "encoding/hex"  "fmt")func main() {  secret := "sammasdcd7478fb6326440ac39e824124799c1"  data := "{\"data\": \"example\", \"magicLab\": 35}"  hash := hmac.New(sha512.New, []byte(secret))  hash.Write([]byte(data))   sha := hex.EncodeToString(hash.Sum(nil))  fmt.Println("Result: " + sha)}
OutPuts:
Result: 166d6d4d59a4b945919de50f996185072523fcaf03282f46ac27dbec4ac129147137ba2ebd1b30c2ad7cc99f4c8cafdb1ed8ad500ba23d59f59f701292b0c566

Uygulamalı Bir Örnek (JWT Token)

Detaylı resmi döküman adresine şuradan ulaşabilirsiniz.

Aşağıdaki token, sunucu isteklerinde kullandığımız token olsun.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiTWFnaWNMYWIifQ.OWHwNIL5bCwt2ONjRE6zgAYCm9EAz5ZtqGdfdJ26xxk

Dikkatlice bakarsak token “.” (nokta) işareti ile ayrılmış 3 parçadan oluşuyor. “Header.Payload.Hash” sırasıyla yer almaktadır. Payload kısmı base64 formatında encode edili bir veridir. Base64 decode ettiğimizde bir json göreceksiniz. Yani veri çıplak bir şekilde requestin içinde yer alıyor. Token’ın hash kısmı ise bizim verimizin secret key ile oluşturulmuş hali. Özetle server’a gelen veri kötü niyetli biri tarafından manipüle edilirse, server gelen verinin hash’ine bakacak ve hash’ler eşleşmediğinden verinin değiştirildiğini kabul edecek.

Payload Kısmı ve Base64 Decode Hali

eyJpZCI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiTWFnaWNMYWIifQdecode base64:
{"id":"1234567890","name":"MagicLab"}

--

--