{"id":1926,"date":"2022-08-01T14:47:20","date_gmt":"2022-08-01T14:47:20","guid":{"rendered":"https:\/\/berenkudaygorun.com\/blog\/?p=1926"},"modified":"2022-08-01T14:47:20","modified_gmt":"2022-08-01T14:47:20","slug":"keychain-data-storage-testing","status":"publish","type":"post","link":"https:\/\/berenkudaygorun.com\/blog\/blog\/2022\/08\/01\/keychain-data-storage-testing\/","title":{"rendered":"Keychain &#8211; Data Storage Testing"},"content":{"rendered":"<p>Keychain'in kullan\u0131m\u0131n\u0131 k\u0131saca a\u00e7\u0131klayacak olursak, ki\u015fisel olmayan verilerin saklanabilece\u011fi k\u00fc\u00e7\u00fck bir depolama alan\u0131d\u0131r. Burada token, key saklayabilirsiniz bu sayede uygulamalarda otomatik login olabilirsiniz ancak bu tarz i\u015flemleri yaparken aatlamaman\u0131z gereken k\u0131s\u0131mlar var.<\/p>\n<p>Normal bir file system'de siz uygulamay\u0131 sildi\u011finizde, uygulama dosyalar\u0131da temizlenir. Ancak keychain bu \u015fekilde \u00e7al\u0131\u015fmamaktad\u0131r. Siz uygulamay\u0131 silseniz bile keychain i\u00e7erisindeki veriler sabit kalacakt\u0131r. Bundan dolay\u0131 testler esnas\u0131nda keychain i\u00e7erisinde ki\u015fisel verilerin saklanmad\u0131\u011f\u0131ndan emin olunulmal\u0131d\u0131r.<\/p>\n<p>Kullan\u0131lmakta olan bir telefandan b\u00fct\u00fcn uygulamalar\u0131n silindi\u011fini ve ba\u015fkas\u0131 ad\u0131na kullan\u0131lmas\u0131 i\u00e7in \u00f6d\u00fcn\u00e7 verildi\u011fini d\u00fc\u015f\u00fcnelim. Daha \u00f6ncesinde kullan\u0131lan ve session token'\u0131 keychain'e kaydedilmi\u015f bir uygumay\u0131 telefonun yeni sahibi indirirse, uygulamay\u0131 ba\u015fkas\u0131 ad\u0131na kullanmaya ba\u015flayabilir.<\/p>\n<p>A\u015fa\u011f\u0131da ilk olarak sadece keychain'de veri kaydeden bir uygulama \u00f6rne\u011fi g\u00f6receksiniz. Kodlar\u0131n\u0131 payla\u015ft\u0131m.<\/p>\n<pre><code class=\"language-swift\">\/\/\n\/\/  ViewController.swift\n\/\/  KeychainKullanimi\n\/\/\n\/\/  Created by Beren Kuday G\u00f6r\u00fcn on 1.08.2022.\n\/\/\n\nimport UIKit\n\nclass ViewController: UIViewController {\n\n    @IBOutlet weak var sonuc: UILabel!\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \/\/ Do any additional setup after loading the view.\n        ekle()\n        oku()\n\n    }\n\n    func ekle()\n    {\n        let query = [\n            kSecValueData : &quot;topsecret&quot;.data(using: .utf8)!,\n            kSecAttrAccount : &quot;password&quot;,\n            kSecClass:kSecClassGenericPassword\n        ] as CFDictionary\n\n        SecItemAdd(query, nil)\n\n    }\n\n    func oku()\n    {\n        let query = [\n            kSecAttrAccount : &quot;password&quot;,\n            kSecClass:kSecClassGenericPassword,\n            kSecReturnData :   true\n        ] as CFDictionary\n\n        var ref : AnyObject? = nil\n        let durum = SecItemCopyMatching(query, &amp;ref)\n        if(durum == 0){\n            let deger = String(data : ref as! Data, encoding: .utf8)\n            sonuc.text = deger\n        }\n        else\n        {\n            sonuc.text = &quot;Veri yok&quot;\n        }\n    }\n\n}\n<\/code><\/pre>\n<p>\u015eimdi bu uygulamay\u0131 daha sonras\u0131nda telefona att\u0131m ve objection ile a\u00e7t\u0131m. Burada objection ile patchleme k\u0131s\u0131mlar\u0131n\u0131 ge\u00e7iyor. Merak edenler bununla ilgili yaz\u0131ma bakabilir. Uygulamay\u0131 objectio ile \u00e7al\u0131\u015ft\u0131r\u0131p keychain'lere bakt\u0131\u011f\u0131mda a\u015fa\u011f\u0131daki sonu\u00e7lar\u0131 elde ediyorum.<\/p>\n<pre><code class=\"language-swift\">...enkudaygorun.KeychainKullanimi on (iPhone: 15.0) [usb] # ios keychain dump\nNote: You may be asked to authenticate using the devices passcode or TouchID\nSave the output by adding `--json keychain.json` to this command\nDumping the iOS keychain...\nCreated                    Accessible    ACL   Type      Account   Service  Data\n-------------------------  ------------  ----  --------  --------  -------  ---------\n2022-08-01 14:25:20 +0000  WhenUnlocked  None  Password  password           topsecret\n2022-08-01 14:08:55 +0000  WhenUnlocked  None  Password  password           topsecret<\/code><\/pre>\n<p>\u015eimdi uygulay\u0131 silece\u011fim ve kodlar\u0131n\u0131 a\u015fa\u011f\u0131daki gibi de\u011fi\u015ftirip tekrardan cihaza g\u00f6nderece\u011fim. Kodlarda yapt\u0131\u011f\u0131m \u015fey asl\u0131nda okuma ve yazma metotlar\u0131n\u0131 yorum sat\u0131r\u0131na almad\u0131r.<\/p>\n<pre><code class=\"language-swift\"> override func viewDidLoad() {\n        super.viewDidLoad()\n        \/\/ Do any additional setup after loading the view.\n        \/\/ekle()\n        \/\/oku()\n\n    }<\/code><\/pre>\n<p>\u0130\u015fte bu \u015fekilde derlendikten sonra bile uygulamay\u0131 silip geri y\u00fckledi\u011fimizde objection arac\u0131yla keychainlerin sabit kald\u0131\u011f\u0131n\u0131 g\u00f6rebilece\u011fiz.<\/p>\n<pre><code class=\"language-swift\">...enkudaygorun.KeychainKullanimi on (iPhone: 15.0) [usb] # ios keychain dump\nNote: You may be asked to authenticate using the devices passcode or TouchID\nSave the output by adding `--json keychain.json` to this command\nDumping the iOS keychain...\nCreated                    Accessible    ACL   Type      Account   Service  Data\n-------------------------  ------------  ----  --------  --------  -------  ---------\n2022-08-01 14:25:20 +0000  WhenUnlocked  None  Password  password           topsecret\n2022-08-01 14:08:55 +0000  WhenUnlocked  None  Password  password           topsecret<\/code><\/pre>\n<p>Peki bu durumun \u00f6n\u00fcne nas\u0131l ge\u00e7ebiliriz? Bu durumun da a\u00e7\u0131klamas\u0131 a\u015fa\u011f\u0131daki kod \u00f6rne\u011findedir. E\u011fer bir uygulama i\u015fk defa ba\u015flat\u0131l\u0131yorsa bu tespit edildikten sonra keychain silinmelidir. b\u00f6ylece eski keychain kullan\u0131lamaz. Yap\u0131 a\u015fa\u011f\u0131daki gibi olabilir.<\/p>\n<pre><code class=\"language-swift\">let userDefaults = UserDefaults.standard\n\nif userDefaults.bool(forKey: &quot;hasRunBefore&quot;) == false {\n    \/\/ Remove Keychain items here\n\n    \/\/ Update the flag indicator\n    userDefaults.set(true, forKey: &quot;hasRunBefore&quot;)\n    userDefaults.synchronize() \/\/ Forces the app to update UserDefaults\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Keychain&#8217;in kullan\u0131m\u0131n\u0131 k\u0131saca a\u00e7\u0131klayacak olursak, ki\u015fisel olmayan verilerin saklanabilece\u011fi k\u00fc\u00e7\u00fck bir depolama alan\u0131d\u0131r. Burada token, key saklayabilirsiniz bu sayede uygulamalarda otomatik login olabilirsiniz ancak bu&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/berenkudaygorun.com\/blog\/blog\/2022\/08\/01\/keychain-data-storage-testing\/\">Devam\u0131n\u0131 oku<span class=\"screen-reader-text\">Keychain &#8211; Data Storage Testing<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[662,659],"tags":[],"class_list":["post-1926","post","type-post","status-publish","format-standard","hentry","category-ios","category-swift","entry"],"_links":{"self":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/comments?post=1926"}],"version-history":[{"count":1,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1926\/revisions"}],"predecessor-version":[{"id":1927,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/posts\/1926\/revisions\/1927"}],"wp:attachment":[{"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/media?parent=1926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/categories?post=1926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/berenkudaygorun.com\/blog\/wp-json\/wp\/v2\/tags?post=1926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}