ATtiny85 ile Android Cihazlar İçin Fiziksel Passkey Yapımı

Günümüzde güvenlik, hem dijital hem de fiziksel alanlarda önemli bir konudur. Android cihazlarınızı korumak için birçok yöntem kullanabilirsiniz, passkey diğer adıyla geçiş anahtarı buna bir örnektir. Fakat burada anlatılan yöntem deneysel amaçlıdır, daha yüksek güvenlik önlemleri yazının en sonunda paylaşacağız.

ATtiny85 ile Android Cihazlar İçin Fiziksel Passkey Yapımı passkey

Arduino IDE’ye Attiny85 Desteğini Eklemek

Bu kısmı daha önce uzun uzun anlattığımız için kısa tutuyoruz, tam haline buradan ulaşabilirsiniz.

Öncelikle Arduino IDE’nin son sürümünün bilgisayarınızda kurulu olduğunu varsayıyoruz, eğer değilse resmi web sayfasından indirebilirsiniz. Arduino IDE kurulumundan sonra;

File -> Preferences -> Settings -> Additional Boards Manager URLs

yolunu takip edin, ardından ilgili kutucuğa ATtiny85 dosyalarını barındıran bu bağlantıyı yapıştırın;

https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json
ATtiny85 ile Android Cihazlar İçin Fiziksel Passkey Yapımı passkey

Ardından;

Tools -> Board -> Boards Manager… yolunu izleyerek arama kutusuna “digistump” yazın ve “Digistump’s AVR Boards” seçeneğini indirin.

ATtiny85 ile Android Cihazlar İçin Fiziksel Passkey Yapımı passkey
ATtiny85 ile Android Cihazlar İçin Fiziksel Passkey Yapımı passkey

Windows 10 kullanıcıları usbser sürücüsü yükleme hatasıyla karşılaşabilirler. Böyle bir durumda doğrudan buradan indirebilirsiniz:

https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip

İndirilen dosyayı çıkartın ve DPinst64.exe‘yi çalıştırarak sürücüyü yükleyin.

Ardından, Arduino IDE’de arayüzünde;

Tools -> Board -> Digistump AVR Boards -> Digispark (Default 16.5 MHz)

Seçeneği ile programlama yapacağınız kartı seçin.

ATtiny85 ile Android Cihazlar İçin Fiziksel Passkey Yapımı passkey

Kurulum tamamlanmıştır.

Passkey Kodunu Hazırlama

Passkey kodumuzda önceden tanımlanmış iki fonksiyonumuz var: setup() ve loop(). Bu içrik için PIN kodunun ‘0000’ olduğunu varsayalım. Kodumuz şu şekilde görünecek:

/*
  -----------------------------------------
  Kodu yazan: devreyakan.com
  Tarih: 06.02.2024
  Lisans: MIT Lisansı
  -----------------------------------------
*/

// Dijital anahtar kütüphanesi ekle
#include "DigiKeyboard.h"

void setup() {
  // Kurulumda yapılacak bir şey yok
}

void loop() {
  // Bu gecikme, bilgisayarın ATtiny'yi takıldıktan sonra tanımasına zaman vermek içindir. 2000 milisaniye 2 saniyedir.
  DigiKeyboard.delay(2000);

  // Şimdi PIN'iniz için tuş vuruşlarını göndereceğiz
  DigiKeyboard.println("0000");

  // PIN'i girdikten sonra, tekrar girebilmemiz için uzun bir gecikme yapacağız.
  // Bu, DigiSpark'ın takılı kaldığında PIN'inizi sonsuza kadar yazmasını önlemek içindir.
  DigiKeyboard.delay(60000);
}

Kodumuzu hazırladıktan sonra, ATtiny85’e yükleme işlemine geçebiliriz. Upload butonuna tıkladıktan sonra arayüz ekranında ki seri ekranda; “Plug in the device now… (will timeout in 60 seconds)” yazacaktır. Bu yazıyı gördükten sonra bilgisayarınıza ATtiny85’i takabilirsiniz. Ardından, “Micronucleus done. Thank you!”, mesajını gördükten sonra ATtiny85’i USB bağlantı noktasından çıkarabilirsiniz.

OTG desteği olan her hangi bir Android cihaza taktıktan sonra otomatik olarak “0000” tuş kombinasyonunu telefona gönderecektir.

Güvenlik Önerileri

Yukarıdaki kod şifrenizi basit bir şekilde gönderir, bu da güvenlik riski yaratır. Ancak, bu riski azaltmak için bazı değişiklikler yapabilirsiniz;

Şifreyi Kodda Saklamayın: Şifrenizi doğrudan kod içine yazmak yerine, bir değişkene atayarak saklayın. Daha sonra bu değişkeni kullanarak şifreyi gönderin.

const char* pin = "0000";
DigiKeyboard.println(pin);

Şifreyi Güvenli Bir Yerde Saklayın: Şifrenizi kod içinde değil, örneğin EEPROM gibi daha güvenli bir yerde saklayın. Bu, kodunuzu inceleyen birinin şifreyi doğrudan görmesini engelleyecektir.

#include <EEPROM.h>

void setup() {
  // EEPROM'e şifreyi yaz
  const char* pin = "0000";
  for (int i = 0; i < strlen(pin); ++i) {
    EEPROM.write(i, pin[i]);
  }
}

void loop() {
  // Loop içinde bir şey yapmaya gerek yok
}

Şifreleme: Şifrelenmiş bir formatta şifreyi saklayabilir ve kullanırken şifreyi çözebilirsiniz. Bu, şifreyi doğrudan görünmez kılacaktır.

#include <AES.h>

AES aes;

void setup() {
  aes.setKey("anahtar123"); // Şifreleme anahtarı
}

void loop() {
  const char* pin = "0000";
  char encrypted[16];
  aes.encryptBlock(pin, encrypted);
  // Şifrelenmiş veriyi gönderme işlemi
}

Yetkilendirme: Kullanıcının cihazın kilidini açma yetkisi olduğunu doğrulamak için ek adımlar ekleyin. Örneğin, belirli bir komut ya da seriyi göndermeden önce belirli bir düğmeye basılmasını gerektirebilirsiniz.

const int buttonPin = 2; // Düğme pin numarası
bool authorized = false; // Yetkilendirme durumu

void setup() {
  pinMode(buttonPin, INPUT);
}

void loop() {
  if (digitalRead(buttonPin) == HIGH) {
    authorized = true; // Düğmeye basıldığında yetkilendir
  }

  if (authorized) {
    // Yetkilendirme yapıldıysa PIN'i gönder
    const char* pin = "0000";
    DigiKeyboard.println(pin);
  }
}

Güvenlik Katmanları: Tek bir güvenlik önlemi kullanmak yerine, birkaç katmanlı bir güvenlik yaklaşımı benimseyin. Örneğin, şifreyi saklarken hem şifreleme hem de EEPROM kullanabilirsiniz.

#include <EEPROM.h>
#include <AES.h>

AES aes;

void setup() {
  aes.setKey("anahtar123"); // Şifreleme anahtarı
}

void loop() {
  // EEPROM'den şifreyi oku
  char decrypted[16];
  for (int i = 0; i < 16; ++i) {
    decrypted[i] = EEPROM.read(i);
  }

  // Şifreyi çöz
  char decrypted_pin[16];
  aes.decryptBlock(decrypted, decrypted_pin);

  // Çözülen PIN'i gönder
  DigiKeyboard.println(decrypted_pin);
}

Bu önlemleri alarak, şifre güvenliğinizi artırabilir ve kodunuzu daha güvenli hale getirebilirsiniz. Ancak unutmayın ki herhangi bir güvenlik önlemi %100 güvenli değildir, ancak riski azaltabilir ve karşı tarafın işlerini biraz daha karmaşık hale getirebilir.