iOS應(yīng)用簽名原理與重簽名

iOS應(yīng)用簽名

何為代碼簽名

代碼簽名,就是對(duì)可執(zhí)行的文件或者腳本進(jìn)行數(shù)字簽名择示。
主要用來(lái)確認(rèn)軟件是否被認(rèn)可束凑,且在簽名后未被修改或者損壞的措施。
與數(shù)字簽名的原理一樣栅盲,只不過簽名的數(shù)據(jù)是代碼而已

簽名流程

通過將源代碼進(jìn)行散列Hash后的Hash值進(jìn)行私鑰M加密并與源代碼一起打包成軟件包汪诉。
在使用端中使用公鑰M進(jìn)行解密得到Hash值,并通過相同的散列Hash對(duì)源代碼進(jìn)行Hash谈秫,將得到的結(jié)果進(jìn)行匹配扒寄,如果一致,說(shuō)明源代碼沒有被篡改過拟烫,且是正版應(yīng)用该编。

蘋果雙層簽名驗(yàn)證原理

首先先分析下Apple應(yīng)用的需求

  • 針對(duì)開發(fā)情況安裝包不需要上傳至App Store,就可以直接安裝至手機(jī)上
  • Apple為了保證系統(tǒng)的安全性硕淑,又必須對(duì)安裝的App有絕對(duì)的控制權(quán)
    • 經(jīng)過Apple允許才能安裝
    • 不能被濫用導(dǎo)致非開發(fā)的App也能被安裝

為了實(shí)現(xiàn)這一需求课竣,Apple開始提出了雙層簽名的iOS簽名方式。

雙層簽名邏輯

在Apple服務(wù)器中存在著一個(gè)私鑰A置媳,而每一部Apple移動(dòng)設(shè)備中存在著公鑰A于樟。這樣一來(lái)就能確保每個(gè)應(yīng)用都是Apple允許的。
但是拇囊,在開發(fā)階段我們需要頻繁的進(jìn)行App的調(diào)試迂曲,因此Apple新增加了一層簽名,來(lái)解決App安裝到設(shè)備上的安全性寥袭。
而這一層簽名是怎么實(shí)現(xiàn)的呢路捧?

初期
  • 通過Mac的鑰匙串訪問生成請(qǐng)求的CSR(Certificate Signing Request)文件
    創(chuàng)建CSR文件時(shí)关霸,Mac會(huì)生成一對(duì)公私鑰M,并將包含有公鑰M的CSR文件發(fā)送給Apple服務(wù)器鬓长。
  • Apple服務(wù)器接收到請(qǐng)求后谒拴,利用私鑰A對(duì)公鑰M進(jìn)行數(shù)字簽名,生成證書涉波。
  • 針對(duì)每個(gè)App生成對(duì)應(yīng)對(duì)描述文件英上。
    這個(gè)描述文件中包含了相應(yīng)的信息和權(quán)限,以及對(duì)應(yīng)的證書(公鑰M的數(shù)字簽名的)
  • 開發(fā)初期會(huì)通過Apple服務(wù)器下載相應(yīng)App的描述文件啤覆,并與Mac上的私鑰M進(jìn)行關(guān)聯(lián)苍日。
App編譯安裝
  • 通過IDE(Xcode)編譯生成的App中包含了Mach-O可執(zhí)行文件App的簽名描述文件窗声。
    App的簽名就是通過私鑰M進(jìn)行的簽名操作生成的相恃。
  • 當(dāng)進(jìn)行App安裝時(shí),手機(jī)上的公鑰A會(huì)去驗(yàn)證你的安裝行為是否合法笨觅。
    通過公鑰A去校驗(yàn)證書信息拦耐,如果能夠解密且對(duì)應(yīng)的Hash校驗(yàn)沒有問題的話,說(shuō)明是合法可安裝的见剩,如果無(wú)法解密或者說(shuō)Hash校驗(yàn)有誤則不合法不能安裝杀糯。
  • 當(dāng)運(yùn)行時(shí),公鑰A解密得到的公鑰M去驗(yàn)證App的簽名苍苞,如果合法就能運(yùn)行固翰,反之不允許運(yùn)行。
image

描述文件

為了解決應(yīng)用濫用的問題羹呵,Apple又添加了兩個(gè)限制
第一 限制在Apple服務(wù)器注冊(cè)過的設(shè)備才能安裝
第二 限制簽名只能針對(duì)某個(gè)具體的App應(yīng)用

  • 且Apple還控制著App中的 iCloud/Push/后臺(tái)運(yùn)行等權(quán)限骂际,所以Apple把這些開關(guān)統(tǒng)一稱為Entitlements(授權(quán)文件),并將這個(gè)文件放到了Provisioning Profile(描述文件)文件中冈欢。
  • 描述文件是在AppleDevelop網(wǎng)站上創(chuàng)建的歉铝,Xcode運(yùn)行時(shí)會(huì)打包進(jìn)App內(nèi)。
  • 開發(fā)時(shí)凑耻,編譯完一個(gè)App后犯戏,用本地的私鑰M對(duì)這個(gè)App進(jìn)行簽名,同時(shí)把系統(tǒng)服務(wù)器獲取到的描述文件打包進(jìn)App中拳话,文件名為embedded.mobileprovision,再把App安裝至手機(jī)上讓系統(tǒng)做驗(yàn)證种吸。

App重簽名

codesign重簽名

針對(duì)已砸殼的ipa包弃衍,我們可以手動(dòng)進(jìn)行重簽名,以便與我們了解其應(yīng)用的內(nèi)部坚俗。
MacOS中镜盯,為我們提供了codesign的終端命令行岸裙,讓我們對(duì)ipa包中對(duì)文件進(jìn)行替換簽名。

利用 codesign 重簽名步驟

  1. 刪除插件(Plugin)和帶有插件的.app包(比如Watch)
  2. 對(duì)Frameworks里面的庫(kù)進(jìn)行重簽名
  3. 給可執(zhí)行文件 +x(可執(zhí)行)權(quán)限
  4. 添加描述文件(新建工程速缆,真機(jī)編譯獲冉翟省)
  5. 替換被簽名BundleID
  6. 通過描述文件創(chuàng)建權(quán)限文件.plist
    • <key>application-identifier</key>
    • <key>keychain-access-groups</key>
    • <key>get-task-allow</key>
    • <key>com.apple.developer.team-identifier</key>
  7. 通過授權(quán)文件(Entilements)重簽.app包

在重簽名過程中涉及到的終端命令:

  • $security find-identity -v -p codesigning (查找并列出鑰匙串中可用于簽名的證書)
  • $codesign -fs "證書串" 文件名(進(jìn)行簽名的替換)
  • $chmod +x 可執(zhí)行文件(給可執(zhí)行文件添加可執(zhí)行權(quán)限)
  • $security cms -D -i ../embedded.mobileprovision(查看描述文件)
  • $codesign -fs "證書串" --no-strict --entitlements=權(quán)限文件.plist App包(App包重簽)
  • $zip -ry 輸出文件 輸入文件(將輸入文件壓縮為輸出文件,進(jìn)行.ipa打包)

Xcode重簽名

  1. 創(chuàng)建一個(gè)同名工程艺糜,生成.app包
  2. 替換.app包
  3. 刪除插件(Plugin)和帶有插件的.app包(比如Watch)
  4. 對(duì)Frameworks里面的庫(kù)進(jìn)行重簽名
  5. 運(yùn)行項(xiàng)目

利用Xcode進(jìn)行Script重簽名

利用腳本重簽名剧董,其實(shí)就是利用了codesign簽名,只是將一個(gè)一個(gè)的步驟通過腳本指令自動(dòng)化的去執(zhí)行破停。

# ${SRCROOT} 它是工程文件所在的目錄
TEMP_PATH="${SRCROOT}/Temp"
#資源文件夾翅楼,我們提前在工程目錄下新建一個(gè)APP文件夾,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目標(biāo)ipa包路徑
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夾
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"

#----------------------------------------
# 1. 解壓IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解壓的臨時(shí)的APP的路徑
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路徑是:$TEMP_APP_PATH"

#----------------------------------------
# 2. 將解壓出來(lái)的.app拷貝進(jìn)入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路徑
# TARGET_NAME target名稱
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路徑:$TARGET_APP_PATH"

rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"

#----------------------------------------
# 3. 刪除extension和WatchAPP.個(gè)人證書沒法簽名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"

#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
#  設(shè)置:"Set : KEY Value" "目標(biāo)文件路徑"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"

#----------------------------------------
# 5. 給MachO文件上執(zhí)行權(quán)限
# 拿到MachO文件的路徑WeChat
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可執(zhí)行權(quán)限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"

#----------------------------------------
# 6. 重簽名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do

#簽名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末真慢,一起剝皮案震驚了整個(gè)濱河市毅臊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黑界,老刑警劉巖管嬉,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朗鸠,居然都是意外死亡蚯撩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門童社,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)求厕,“玉大人,你說(shuō)我怎么就攤上這事扰楼⊙窖ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵弦赖,是天一觀的道長(zhǎng)项栏。 經(jīng)常有香客問我,道長(zhǎng)蹬竖,這世上最難降的妖魔是什么沼沈? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮币厕,結(jié)果婚禮上列另,老公的妹妹穿的比我還像新娘。我一直安慰自己旦装,他們只是感情好页衙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般店乐。 火紅的嫁衣襯著肌膚如雪艰躺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天眨八,我揣著相機(jī)與錄音腺兴,去河邊找鬼。 笑死廉侧,一個(gè)胖子當(dāng)著我的面吹牛页响,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伏穆,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拘泞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了枕扫?” 一聲冷哼從身側(cè)響起陪腌,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烟瞧,沒想到半個(gè)月后诗鸭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡参滴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年强岸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾赔。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝌箍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暴心,到底是詐尸還是另有隱情妓盲,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布专普,位于F島的核電站悯衬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏檀夹。R本人自食惡果不足惜筋粗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炸渡。 院中可真熱鬧娜亿,春花似錦、人聲如沸蚌堵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至策州,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宫仗,已是汗流浹背够挂。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留藕夫,地道東北人孽糖。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像毅贮,于是被迫代替她去往敵國(guó)和親办悟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354