SSKeychain

Keychain 使用? ---為了實用最大化我覺得我應該直接先說使用!

當然是使用第三方庫啦:sskeychain 3000+星星的庫不開玩笑。github地址:https://github.com/soffes/sskeychain

導入完之后首先,編譯一下有無錯。

如果是自己手動導入:

1.把SSKeychain.h SSKeychain.m SSKeychainQuery.h SSKeychainQuery.m 復制到工程

2.添加Security.framework 怎么添加?點一下那個+?

?

3.SSKeychain.h有錯?把SSKeychain.h 中的#import <SSKeychain/SSKeychainQuery.h> 換成?#import <Foundation/Foundation.h>?#import "SSKeychainQuery.h" 吧。

還有錯?作為小白我的也不知道了,發我郵件一起討論吧。

?

?

接下來演示4個過程

基本說明:儲存的數據有三個 1.服務名(這個方便對賬號密碼進行分類)2.賬號3.密碼 而這三個數據都是NSString (如果要存其他類型呢,請看后面吧)

所用到的API :

添加和更新都用這個: + (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account ;

查詢密碼:+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;

刪除:+ (BOOL)deletePasswordForService:(NSString?*)serviceName account:(NSString?*)account;

1.添加一條鑰匙 ? ?(這個鑰匙的信息 由 服務名+賬號+密碼 組成)

記得添加頭文件

#import "SSKeychain.h"

#import "SSKeychainQuery.h"

?

//先定義一下要用的東東

? ??NSString *serviceName= @"com.keychaintest.data";

? ? NSString *account = @"m4abcd";

? ? NSString *password = @"12345678";

//加入鑰匙串!

? ? if ([SSKeychain setPassword:password forService:serviceName account:account]) {

? ? ? ? NSLog(@"success !");

? ? }

說明:就是這么簡單咯。

2.查詢

1.查詢某service 下 count 的密碼并且打印出來:

  NSLog(@"%@",[SSKeychain passwordForService:serviceName account:account]);

2.查詢service下所有鑰匙:

? ? ?NSArray *keys = [SSKeychain accountsForService:serviceName];

這是我的輸出:

2016-03-04 15:08:43.785 keychaintest[31342:4403403] (

? ? ? ? {

? ? ? ? acct = m4abcd;

? ? ? ? agrp = test;

? ? ? ? cdat = "2016-03-03 07:10:58 +0000";

? ? ? ? mdat = "2016-03-04 07:08:43 +0000";

? ? ? ? pdmn = ak;

? ? ? ? svce = "com.keychaintest.data";

? ? ? ? sync = 0;

? ? ? ? tomb = 0;

? ? }

)

說明:返回的結果為數組,數組成員就是我們查詢的鑰匙,這里只有一個鑰匙,而鑰匙信息以字典的形式構建的,鍵acct 就是count,鍵svce 就是serviceName。密碼在哪里?用方法1去取吧騷年!

3.查詢本appkeychain的所有鑰匙

  NSArray?*keys =?[SSKeychain allAccounts];?

3.更新

? ? if([SSKeychain setPassword:@"321321" forService:serviceName account:account]){

    NSLog(@"set success!");

  }

4.刪除 

? if([SSKeychain?deletePasswordForService:serviceName account:account]){

    NSLog(@"delete success!");

  }

?說明:刪除就是把這一條鑰匙刪除哦,不是只刪除密碼!

另外的說明:如果你的password 是NSData?

查詢: + (NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account;

設置or更新:+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account;

?

下面開始淺淺的理解還有對蘋果API進行一點點說明吧

1.Keychain 是什么?

keychain 就是放鑰匙柜子!就是蘋果提供給我們的一個保險柜。

這篇文章僅針對iOS。

在iOS中每個APP 都有屬于自己的Keychain,最常用就是保存用戶的賬戶和密碼,就是記住密碼,放在這里很安全(蘋果負責幫我們加密再存起來,如果出了問題怪他咯!),假如用NSUserDefault 保存這些秘密數據,生成的plist文件(就放在那個Library/Preferences 下)容易被拿到,而且還要自己做加密。

特性:1.當app刪除了,又再次重新安裝,這個保險柜里的信息還存在哦。 所以當你的某女同學登了APP并保存了密碼,你重裝了APP,如果不刪除記錄,你女票還是可以發現的。

   2.安全!作為小白的我并不知道它實際上是存在哪里的。

2.Keychain 組成?

1.組成部分由 ?{N個標簽(屬性) + 一個重要數據} 組成!

2.結構可以看成是一個字典的形式大概是這樣的: @{@"屬性key1":@"屬性值1",@"屬性keyN":@"屬性值N",@"valueData":@數據}?

3.內容說明:

一個重要數據:就是密碼password!

N個標簽:也是屬性,都是用來表明這條鑰匙的,如我們的serviceName ,account 都是屬性,他們對應的鍵為?kSecAttrAccount 和?kSecAttrAccount,還有系統給我們加的創建時間,修改時間等還有label,type,port,你自己打開文件進去看看吧,這些標簽的任務就是來表明這條鑰匙是獨一無二的。?

3.原始API操作

先來看看幾個API

添加鑰匙:        OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef * __nullable CF_RETURNS_RETAINED result)

查詢密碼與查詢標簽:   ??OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_RETAINED result)

更新鑰匙信息:   ? ? ? ? ? OSStatus SecItemUpdate(CFDictionaryRef query,?CFDictionaryRef attributesToUpdate)

刪除鑰匙:        OSStatus SecItemDelete(CFDictionaryRef query)

先說明一下 這些API的關鍵在于1.是理解和配置好這個操作字典 2.注意返回的OSStatus 狀態?3.CF對象與OC 之間的bridge

1.先來一發查找 ?

過程:

1.(關鍵)先配置一個操作字典內容有:

kSecAttrService(屬性),kSecAttrAccount(屬性) 這些屬性or標簽是查找的依據

kSecReturnData(值為@YES 表明返回類型為data),kSecClass(值為kSecClassGenericPassword 表示重要數據為“一般密碼”類型) 這些限制條件是返回結果類型的依據

2.然后用查找的API 得到查找狀態和返回數據(密碼)

3.最后如果狀態成功那么將數據(密碼)轉換成string 返回

//用原生的API 實現查詢密碼

- (NSString *)passwordForService:(nonnull NSString *)service account:(nonnull NSString *)account{

//生成一個查詢用的 可變字典

? ? NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:4];

? ? [dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; //表明為一般密碼可能是證書或者其他東西

? ? [dict setObject:service forKey:(__bridge id)kSecAttrService]; ? ?//輸入service

? ? [dict setObject:account forKey:(__bridge id)kSecAttrAccount]; ?//輸入account

? ? [dict setObject:@YES forKey:(__bridge id)kSecReturnData]; ? ? //返回Data

//查詢 ? ?

? ? OSStatus status = -1;

? ? CFTypeRef result = NULL;

? ? status = SecItemCopyMatching((__bridge CFDictionaryRef)dict,&result);//核心API?查找是否匹配?和返回密碼!

? ? if (status != errSecSuccess) { //判斷狀態

? ? ? ? return nil;

? ? }

//返回數據

? ? NSString *password = [[NSString alloc] initWithData:(__bridge_transfer NSData *)result encoding:NSUTF8StringEncoding];//轉換成string

? ? return password;

}

說明:其實關鍵就在于這個操作字典的配置上!

2.添加&更新

說明:當添加的時候我們一般需要判斷一下當前鑰匙串里面是否已經存在我們要添加的鑰匙。如果已經存在我們就更新好了,不存在再添加,所以這兩個操作一般寫成一個函數搞定吧。

過程關鍵:1.檢查是否已經存在 構建的查詢用的操作字典:kSecAttrService,kSecAttrAccount,kSecClass(標明存儲的數據是什么類型,值為kSecClassGenericPassword 就代表一般的密碼)

   2.添加用的操作字典: kSecAttrService,kSecAttrAccount,kSecClass,kSecValueData

   3.更新用的操作字典1(用于定位需要更改的鑰匙):kSecAttrService,kSecAttrAccount,kSecClass?

        操作字典2(新信息)kSecAttrService,kSecAttrAccount,kSecClass ,kSecValueData

?

//用原生的API 添加一條鑰匙

-(BOOL)addItemWithService:(NSString *)service account:(NSString *)account password:(NSString *)password{

//先查查是否已經存在

//構造一個操作字典用于查詢

? ? NSMutableDictionary *searchDict = [[NSMutableDictionary alloc]initWithCapacity:4];

? ? [searchDict setObject:service forKey:(__bridge id)kSecAttrService]; ? ? ? ? ? ? ? ? ? ? ? ? //標簽service

? ? [searchDict setObject:account forKey:(__bridge id)kSecAttrAccount]; ? ? ? ? ? ? ? ? ? ? ? ? //標簽account

? ? [searchDict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];//表明存儲的是一個密碼

? ??

? ? OSStatus status = -1;

? ? CFTypeRef result =NULL;

? ? status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDict, &result);

? ? if (status == errSecItemNotFound) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //沒有找到則添加

? ? ? ? NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding];? ? //password 轉換為 NSData

? ? ? ? [searchDict setObject:passwordData forKey:(__bridge id)kSecValueData]; ? ? ? //添加密碼? ? ??

? ? ? ? status = SecItemAdd((__bridge CFDictionaryRef)searchDict, NULL); ? ? ? ? ? ? //!!!!!關鍵的添加API

? ? }else if (status == errSecSuccess){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //成功找到,說明鑰匙已經存在則進行更新

? ? ? ? NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding];? ? //password 轉換為 NSData

? ? ? ? NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:searchDict];

? ? ? ? [dict setObject:passwordData forKey:(__bridge id)kSecValueData]; ? ? ? ? ? ? //添加密碼? ? ?

? ? ? ? status = SecItemUpdate((__bridge CFDictionaryRef)searchDict, (__bridge CFDictionaryRef)dict);//!!!!關鍵的更新API

? ? }

? ? return (status == errSecSuccess);

}

?

?

?

轉載:http://www.cnblogs.com/m4abcd/p/5242254.html

轉載于:https://www.cnblogs.com/sunjianfei/p/6560309.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393491.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393491.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393491.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell高級-----正則表達式

正則表達式概述 正則表達式是一種定義的規則&#xff0c;Linux工具可以用它來過濾文本。 基礎正則表達式 純文本 [rootnode1 ~]# echo "this is a cat" | sed -n /cat/p this is a cat [rootnode1 ~]# echo "this is a cat" | gawk /cat/{print $0} this …

leetcode130. 被圍繞的區域(bfs)

給定一個二維的矩陣&#xff0c;包含 ‘X’ 和 ‘O’&#xff08;字母 O&#xff09;。 找到所有被 ‘X’ 圍繞的區域&#xff0c;并將這些區域里所有的 ‘O’ 用 ‘X’ 填充。 示例: X X X X X O O X X X O X X O X X 運行你的函數后&#xff0c;矩陣變為&#xff1a; X X…

linux mysql提交_MySQL 事務提交過程

開發老大要求通過binlog查詢一條被修改的數據&#xff0c;數據被查出后問我&#xff0c;有沒有可能binlog中不會記錄&#xff0c;回答不會&#xff0c;因為數據被修改&#xff0c;若失敗直接回滾&#xff0c;不會在binlog中記錄&#xff0c;此刻一個朋友用了洪荒之力告訴我&…

spray.json_如何使用Spray-json(Un)在Akka HTTP中封送JSON

spray.jsonby Miguel Lopez由Miguel Lopez 如何使用Spray-json(Un)在Akka HTTP中封送JSON (How to (Un)marshal JSON in Akka HTTP with spray-json) In the previous post, we added JSON support to our Akka HTTP API using circe.在上一篇文章中 &#xff0c;我們使用circ…

React單元測試:Jest + Enzyme(二)

前言 在上一篇教程中&#xff0c;我們成功搭建了基于Jest和Enzyme的單元測試框架并成功地跑起來第一個單元測試&#xff0c;可以點擊這里回顧一下。今天&#xff0c;我們重點討論如何通過Jest來mock數據。 什么是Mock Mock的簡單翻譯就是模擬。既可以模擬數據&#xff0c;也可以…

input file 文件上傳,js控制上傳文件的大小和格式

文件上傳一般是用jquery的uploadify&#xff0c;比較好用。后面會出文章介紹uploadify這個插件。 但是&#xff0c;有時候為了偷懶&#xff0c;直接就用input 的file進行文件和圖片等的上傳&#xff0c;input file 可以控制上傳的格式&#xff0c;但是是html5&#xff0c;很多瀏…

leetcode面試題 17.08. 馬戲團人塔(二分法)

有個馬戲團正在設計疊羅漢的表演節目&#xff0c;一個人要站在另一人的肩膀上。出于實際和美觀的考慮&#xff0c;在上面的人要比下面的人矮一點且輕一點。已知馬戲團每個人的身高和體重&#xff0c;請編寫代碼計算疊羅漢最多能疊幾個人。 示例&#xff1a; 輸入&#xff1a;…

如何選擇適合自己的CMS建站系統

如今做網站已不像過去那樣必須找網站公司才能建&#xff0c;因為網上針對建站的各種CMS建站系統層出不窮。像PageAdmin、DEDECMS、帝國CMS、Discuz等&#xff0c;這些CMS系統各有各的特點和優勢&#xff0c;小熊優化的小編我從事網站制作和網站優化多年&#xff0c;和很多建站朋…

python dict hash算法_2020年3月26日python學習筆記——hash

什么是哈希&#xff1f;hash,一般翻譯做散列、雜湊&#xff0c;或音譯為哈希&#xff0c;是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出&#xff0c;該輸出就是散列值。這種轉換是一種壓縮映射&#xff0c;也就是&#xff0c;散列值的空間通常遠…

數據處理不等式:Data Processing Inequality

我是在差分隱私下看到的&#xff0c;新解決方案的可用性肯定小于原有解決方案的可用性&#xff0c;也就是說信息的后續處理只會降低所擁有的信息量。 那么如果這么說的話為什么還要做特征工程呢&#xff0c;這是因為該不等式有一個巨大的前提就是數據處理方法無比的強大&#x…

aws架構_如何使用AWS構建可擴展架構

aws架構What I learned building the StateOfVeganism ?我學到的建立素食主義的方法是什么&#xff1f; By now, we all know that news and media shape our views on the topics we discuss. Of course, this is different from person to person. Some might be influence…

gulp 實現sass自動化 ,監聽同步

實現功能 監聽scss文件   sass自動化 準備條件 1 .安裝gulp npm init ---->一直enter&#xff0c;會在當前目錄下生成一個package.json文件,記錄安裝的依賴模塊 npm install gulp --save-dev 2 .安裝gulp-ruby-sass npm install gulp-ruby-sass 你還需要安裝ruby環境…

leetcode面試題 10.03. 搜索旋轉數組(二分法)

搜索旋轉數組。給定一個排序后的數組&#xff0c;包含n個整數&#xff0c;但這個數組已被旋轉過很多次了&#xff0c;次數不詳。請編寫代碼找出數組中的某個元素&#xff0c;假設數組元素原先是按升序排列的。若有多個相同元素&#xff0c;返回索引值最小的一個。 示例1: 輸入…

MSSQL → 02:數據庫結構

一、數據庫的組成 在SQL Server 2008中&#xff0c;用戶如何訪問及使用數據庫&#xff0c;就需要正確了解數據庫中所有對象及其設置。數據庫就像一個容器&#xff0c;它里面除了存放著數據的表之外&#xff0c;還有視圖、存儲過程、觸發器、約束等數據庫對象。數據庫管理的核心…

JAVA拳皇_拳皇(Java簡單的小程序)代碼實例|chu

剛開始學習Java&#xff0c;看完老九君的視頻根據他的內容敲的代碼&#xff0c;感覺還挺有成就感的&#xff0c;畢竟剛學習Java。package helloasd;import java.util.*; public class hellojava { public static void main(String[] args) { Scanner input new Scanner(System…

mySQL教程 第9章 觸發器

第9章 觸發器 入的新數據放到new表&#xff0c;刪除的數據放到old表。 準備本章學習環境 連接數據庫schoolDB&#xff0c;刪除表TStudent&#xff0c;TScore和Tsubject中的所有數據。 delete from TStudent; delete from TScore; delete from TSubject; 向學生表插入兩條記錄 i…

vue使用python_如何使用Python和Vue創建兩人游戲

vue使用pythonby Neo Ighodaro由新Ighodaro 如何使用Python和Vue創建兩人游戲 (How to create a two-player game with Python and Vue) In this tutorial, we will create a realtime tic-tac-toe game using Python and Pusher channels. Here’s a demo of how the game wi…

掩碼圖制作photoshop__新手用

1.首先你得有一張圖&#xff0c;比如這樣的&#xff1a; 2.用PS打開他 3.左邊工具欄里&#xff08;快速選擇工具W&#xff09;&#xff0c;選想顯示的部分 4.ctrlc復制一下&#xff0c;新建一張黑底圖粘貼上去或者白底圖時選中顯示區即花瓣右鍵反向右鍵填充成黑色 5.菜單欄->…

leetcode287. 尋找重復數(二分法)

給定一個包含 n 1 個整數的數組 nums&#xff0c;其數字都在 1 到 n 之間&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一個重復的整數。假設只有一個重復的整數&#xff0c;找出這個重復的數。 示例 1: 輸入: [1,3,4,2,2] 輸出: 2 代碼 class Solution {…

os-enviroment

pip3 install PyUserInput ping 是不帶協議的轉載于:https://www.cnblogs.com/liuweimingcprogram/p/10957592.html