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.
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
Ardından;
Tools -> Board -> Boards Manager…
yolunu izleyerek arama kutusuna “digistump” yazın ve “Digistump’s AVR Boards” seçeneğini indirin.
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.
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.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.