混淆 API 密鑰

作者:Joe,原文鏈接,原文日期:2016-04-16
譯者:pucca601鹿鳖;校對:Cee;定稿:千葉知風(fēng)

密鑰壮莹,或者說「憑證」翅帜,是在使用 REST API 時難免會碰到的一件事情。當你注冊了 Amplitude 后命满,你會得到一個密鑰用來唯一識別你的應(yīng)用涝滴。若你使用的是 Aeris Weather 的 API,會得到一個 ID 和密碼周荐。如果你要在 iOS 應(yīng)用里調(diào)用這些 API狭莱,則需要把這些 API 密鑰放在某處。在之前的一篇文章中我們整理了如何在屬性列表文件中放置 API 密鑰概作。這篇教程中腋妙,我們將要加密這些 API 密鑰并且關(guān)注如何在你的 app 中訪問它們。

在我們開始之前讯榕,我想要談?wù)劙踩珕栴}骤素。我不是一個安全領(lǐng)域的專家,你很可能也不是愚屁。這篇文章原本的標題是「加密 API 密鑰」济竹,但經(jīng)過再三考慮,我重新將其命名為「混淆 API 密鑰」霎槐。文章中沒有一處對這種混淆方式不會被破解進行了保證送浊,因為任何人真的想要盜取你的 API 密鑰時一定會用各種手段獲取到∏鸬混淆這種方式只能為盜取提高一點門檻袭景。

加密你的密鑰

想要對我們的 API 密鑰另加一層保護,我們需要用到 Blowfish Cipher Feedback闭树。使用這種加密方式你需要選擇:

  • 一串密鑰
  • 一個初始化矩陣

密鑰至少有 8 個字符耸棒,至多 56 個字符。選擇任意你喜歡的密鑰:一個詞組报辱,亦或是混亂的字符与殃。初始化矩陣應(yīng)該是個隨意的 8 字節(jié)矩陣。選擇完密鑰和初始化矩陣后,下載我們的 Key Encrypter幅疼。輸入密鑰和初始化矩陣字符串米奸,以及你希望加密的 API 密鑰。例如衣屏,我們要加密的 API 密鑰是 6bbb3654679105f33cf8c491ed9b04df躏升,密鑰是 dontusethissecret辩棒,初始化矩陣是 decafbadbaddecaf狼忱。輸入后點擊 Encrypt

點擊后的輸出結(jié)果是一串十六進制的字符串一睁,一起的钻弄,當然,還有最初的密鑰和初始化矩陣者吁。

解密你的密鑰

加密和解密的程序用了 Blowfish 的實現(xiàn)窘俺,源碼在 mbed TLS 上。程序用 C 語言實現(xiàn)复凳,在 Swift 中可以利用一個 bridging header 來使用這段程序瘤泪。

我們的解密方法在 Swift 中看起來像這樣:

func decrypt(message:[UInt8], key:String, iv:[UInt8]) -> String? {
  var context:mbedtls_blowfish_context = mbedtls_blowfish_context()
  let keybits = UInt32(key.characters.count*8)
  
  // 初始化 Blowfish context 和設(shè)置 key
  mbedtls_blowfish_init(&context)
  mbedtls_blowfish_setkey(&context, key, keybits)
 
  var decryptIV:[UInt8] = iv
  var ivOffset          = 0
  var output:[UInt8]    = [UInt8](count:message.count, repeatedValue:0)
 
  if mbedtls_blowfish_crypt_cfb64(&context,
                                MBEDTLS_BLOWFISH_DECRYPT,
                                message.count,
                                &ivOffset,
                                &decryptIV,
                                message,
                                &output) == 0 {
    return String(bytes: output, encoding: NSUTF8StringEncoding)
  } else {
    return nil
  }
}

現(xiàn)在的問題是,在你的代碼中如何使用解密方法以及要將密鑰和初始化矩陣該放在何處育八。這取決于你(還有多種方法可以做到)对途。只要記住不管你做什么,如果有人決心要破解你的加密信息髓棋,他們一定能想盡各種辦法做到实檀。這只是當從一臺越獄的手機上解密和反編譯 app 后,他們需要另外攻破的一道防線按声。

為了測試我們對生成的字符串的解密方法膳犹,下載這個 iOS 例子,在 Xcode 里打開签则,然后運行须床。你需要對照一下原始的 API 密鑰 6bbb3654679105f33cf8c491ed9b04df。

獲取源代碼

Mac 上的加密應(yīng)用和解密 API 驗證序列的代碼可以在 Bitbucket 找到:

您可以自定義修改你的加密程序渐裂;Blowfish CFB 僅僅是眾多選項中的一種豺旬。

一些思考

老實說,發(fā)這篇文章我有些擔(dān)憂芯义。安全是一個吸引了很多注意力的話題哈垢,關(guān)注的開發(fā)者中有很多都有自己的態(tài)度。你會經(jīng)常聽到如下:

  • 混淆方式不安全扛拨!
  • 永遠不要寫你自己的加密程序耘分!
  • 如果你不知道自己在做什么就不要做!

等諸如此類的說辭。盡管與此同時我們被告知要更有安全意識并且在編寫過程中保持這種意識求泰。用來訪問服務(wù)的 REST API 驗證序列提供給每日開發(fā)者央渣,而大多數(shù)文檔掩蓋了如何將其更安全地嵌入你的移動應(yīng)用中。

最后渴频,Dexguard 的安卓版作者在 Stack Overflow 上總結(jié)了一篇關(guān)于如何恰當?shù)卮鎯?API 密鑰的文章:

最終變成了經(jīng)濟學(xué)上的交易問題你必須做出選擇:你的密鑰有多重要芽丹,你能負擔(dān)多少時間,負擔(dān)多貴的軟件卜朗,對序號感興趣的黑客有多么復(fù)雜拔第,他們愿意花費多少時間,延遲黑客獲取密鑰有多少價值场钉,成功了的黑客多大程度會分發(fā)密鑰蚊俺,等等。類似密鑰這樣小的信息片段比整個應(yīng)用更難防護逛万。本質(zhì)上來說泳猬,在客戶端沒有什么是不能破解的,然而你還是可以設(shè)置障礙宇植。 – Eric LaFortune

當你要做出決策關(guān)于在你的移動應(yīng)用上實行什么樣的安全等級得封,這些都是很好的參考準則。某些時候你必須在你的密鑰被發(fā)現(xiàn)的可能性與有些只要黑客想要就一定會失去的東西之前做個平衡之后指郁,決定你要在你的應(yīng)用代碼里混淆 API 驗證序列中投入多少時間精力忙上。

本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán)坡氯,最新文章請訪問 http://swift.gg晨横。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箫柳,隨后出現(xiàn)的幾起案子手形,更是在濱河造成了極大的恐慌,老刑警劉巖悯恍,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件库糠,死亡現(xiàn)場離奇詭異,居然都是意外死亡涮毫,警方通過查閱死者的電腦和手機瞬欧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罢防,“玉大人艘虎,你說我怎么就攤上這事≈渫拢” “怎么了野建?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵属划,是天一觀的道長。 經(jīng)常有香客問我候生,道長同眯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任唯鸭,我火速辦了婚禮须蜗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘目溉。我一直安慰自己明肮,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布停做。 她就那樣靜靜地躺著晤愧,像睡著了一般大莫。 火紅的嫁衣襯著肌膚如雪蛉腌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天只厘,我揣著相機與錄音烙丛,去河邊找鬼。 笑死羔味,一個胖子當著我的面吹牛河咽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赋元,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忘蟹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搁凸?” 一聲冷哼從身側(cè)響起媚值,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎护糖,沒想到半個月后褥芒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡嫡良,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年锰扶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寝受。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坷牛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出很澄,到底是詐尸還是另有隱情京闰,我是刑警寧澤锨亏,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站忙干,受9級特大地震影響器予,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捐迫,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一乾翔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧施戴,春花似錦反浓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肪笋,卻和暖如春月劈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藤乙。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工猜揪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坛梁。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓而姐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親划咐。 傳聞我的和親對象是個殘疾皇子拴念,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,135評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)褐缠,斷路器政鼠,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 0x01 目錄 常見編碼: ASCII編碼 Base64/32/16編碼 shellcode編碼 Quoted-p...
    H0f_9閱讀 12,783評論 2 17
  • 1.《殺破狼1》 (2005年)9.8分 2015年的香港熱門電影《殺破狼2》無論是在口碑上...
    雅痞鮮師閱讀 1,500評論 2 3
  • 今天你們猜我今天遇見什么呢?你們猜不出來吧,我找到了我生命中的希望點送丰,我決定出去學(xué)點東西去缔俄,一個人不想堅持,就一定...
    冰涼詩雨閱讀 126評論 0 0