sha1-collision & android signature algorithm

SHA1-Collision & Android Sign

參看SHA1-collision我們可以知道茄靠,SHA-1簽名已經(jīng)不安全了窘哈,簽名算法可以考慮升級(jí)到SHA-2或者其他算法匠襟。

0x01 SHA1-Collision

1. SHA-1是什么庇勃?

SHA-1(英語:Secure Hash Algorithm 1陷舅,中文名:安全散列算法1)是一種密碼散列函數(shù)望薄,美國(guó)國(guó)家安全局設(shè)計(jì)疟游,并由美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所(NIST)發(fā)布為聯(lián)邦數(shù)據(jù)處理標(biāo)準(zhǔn)(FIPS)[2]。SHA-1可以生成一個(gè)被稱為消息摘要的160位(20字節(jié))散列值痕支,散列值通常的呈現(xiàn)形式為40個(gè)十六進(jìn)制數(shù)颁虐,參考:SHA-1

2. SHA1-Collision是什么?

兩個(gè)內(nèi)容不同的數(shù)據(jù)卧须,SHA-1算法會(huì)生成相同的摘要信息另绩,參考:SHA1 collision Two PDF儒陨。

3. SHA1-Collision對(duì)Android的影響

Android SDK默認(rèn)對(duì)apk使用SHA-1簽名,在最壞的情況下笋籽,攻擊者可以偽造SHA-1值相同的文件替換已簽名apk中的文件來達(dá)到攻擊的目的蹦漠。

0x02 Android的證書驗(yàn)證機(jī)制

我們知道Android的Apk文件是一個(gè)壓縮文件,文件結(jié)構(gòu)大致如下:

.
├── AndroidManifest.xml
├── META-INF
│   ├── CERT.RSA
│   ├── CERT.SF
│   └── MANIFEST.MF
├── assets
├── classes.dex
├── classes2.dex
├── classes3.dex
├── lib
├── res
└── resources.arsc

apk相關(guān)的簽名相關(guān)的文件在META-INF目錄中车海,其中:

  • MANIFEST.MF
    遍歷APK包中除了META-INF\文件夾以外的所有文件笛园,利用SHA-1算法生成這些文件的消息摘要,然后轉(zhuǎn)化為對(duì)應(yīng)的base64編碼侍芝。MANIFEST.MF存儲(chǔ)的是文件的摘要值研铆,保證完整性,防止文件被篡改竭贩。

  • .SF
    xx.SF文件(xx為使用者證書的自定義別名蚜印,默認(rèn)為CERT,即CERT.SF)留量,保存的是MANIFEST.MF的摘要值窄赋, 以及MANIFEST.MF中每一個(gè)摘要項(xiàng)的摘要值,然后轉(zhuǎn)化成對(duì)應(yīng)的base64編碼楼熄。雖然該文件的后綴名.sf(SignatureFile)看起來是簽名文件忆绰,但是并沒有私鑰參與運(yùn)算,也不保存任何簽名內(nèi)容可岂。

  • .RSA/.DSA
    .RSA/.DSA文件(后綴不同采用的簽名算法不同错敢,.RSA使用的是RSA算法,.DSA使用的是數(shù)字簽名算法DSA缕粹,目前APK主要使用的是這兩種算法)稚茅,保存的是第二項(xiàng).SF文件的數(shù)字簽名,同時(shí)還會(huì)包括簽名采用的數(shù)字證書(公鑰)平斩。特別說明亚享,當(dāng)使用多重證書簽名時(shí),每一個(gè).sf文件必須有一個(gè).RSA/.DSA文件與之對(duì)應(yīng)绘面,也就是說使用證書CERT1簽名時(shí)有CERT1.SF和CERT1.RSA欺税,同時(shí)采用證書CERT2簽名時(shí)又會(huì)生成CERT2.SF和CERT2.RSA。

Android 系統(tǒng)不允許安裝沒有任何數(shù)字簽名的應(yīng)用APK程序揭璃,所有應(yīng)用程序必須使用某個(gè)證書進(jìn)行簽名(一般為應(yīng)用開發(fā)者自簽名證書)晚凿,
APK源文件,首先由應(yīng)用開發(fā)者使用自己的私鑰瘦馍,對(duì)整個(gè)文件進(jìn)行簽名歼秽,生成上述的三個(gè)文件,然后打包成簽名后的APK文件情组;然后發(fā)布到市場(chǎng)哲银。

用戶從市場(chǎng)下載APK安裝文件扛吞,在真正安裝APK前,會(huì)首先驗(yàn)證數(shù)字簽名荆责。具體步驟:

  1. 首先計(jì)算除META-INF\ 文件夾以外所有文件的SHA1摘要值,同MANIFEST.MF文件中的摘要值做比對(duì)亚脆。如果不同做院,則證明源文件被篡改,驗(yàn)證不通過濒持,拒絕安裝键耕。
  2. 計(jì)算MANIFEST.MF的摘要值, 以及MANIFEST.MF中每一個(gè)摘要項(xiàng)的摘要值柑营,同.SF文件中的摘要值做比對(duì)屈雄。如果不同,則證明.SF被篡改官套,驗(yàn)證不通過酒奶,拒絕安裝。
  3. 從.RSA 文件中取出開發(fā)者證書奶赔,然后從證書中提取開發(fā)者公鑰惋嚎,用該公鑰對(duì).SF文件做數(shù)字簽名,并將結(jié)果同.RSA文件中的.SF簽名進(jìn)行比對(duì)站刑。如果不同另伍,則驗(yàn)證不通過,拒絕安裝绞旅。

摘自:Shadows Everywhere

0x03 Android支持的簽名算法

android 4.3之前不支持SHA1之外的其他簽名算法摆尝,在4.3之后支持了SHA2等算法,詳見:

There is security vs compatibility trade off a few might be interested in. Pre-4.3, Android did not support any signature algorithms except SHA1. With Android >= 4.3, SHA256 support was fixed, and SHA384, SHA512, and ECDSA were added (source). There are still android 2.3.3 (android-10) devices being sold, so anyone interested in backwards compatibility will have to heed this.

測(cè)試?yán)釉斠姡?a target="_blank" rel="nofollow">how-to-migrate-your-android-apps-signing-key

下面是提交給google的bug鏈接:APKs signed using SHA256withRSA or with individual files hashed using SHA-256 fail to install

在android 4.3版本之前的手機(jī)上面安裝使用sha-256簽名的app時(shí)因悲,錯(cuò)誤日志信息大致如下:

adb install -r Downloads/notepad-sha256withrsa-sha256.apk
~/Downloads/notepad-sha256withrsa-sha256.apk: 1 file pushed. 4.3 MB/s (62395 bytes in 0.014s)
    pkg: /data/local/tmp/notepad-sha256withrsa-sha256.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

0x04 簽名生成與查看

  • 生成keystore
keytool -genkey -v -keystore test.keystore -alias testkey -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -dname "cn=Test,ou=Test,c=CA" -validity 10000
  • 查看APK的簽名算法
keytool -printcert -jarfile notepad-sha1withrsa-sha1.apk
  • 查看keystore
keytool -list -v -keystore test.keystore
  • jarsigner簽名
jarsigner -keystore mykeystore -storepass password -sigalg SHA256withRSA -digestalg SHA256 my.apk test 

0x05 jarsigner與apksigner的區(qū)別

jarsigner是jdk自帶的工具堕汞,apksigner是android sdk自帶的工具(build-tools 24.0.3+版本才擁有)。在android build-tools 24.0.3以前默認(rèn)使用jarsigner對(duì)app進(jìn)行簽名囤捻,在24.0.3版本以及之后使用apksigner進(jìn)行簽名臼朗,其中apksigner簽名算法根據(jù)android的最低版本的不同而不同,jarsigner則可以直接指定簽名算法(見: 上面的jarsigner簽名)蝎土。

tool minSdkVersion < 18 minSdkVersion >= 18
apksigner SHA1withRSA SHA256withRSA
apksigner SHA1withDSA SHA256withDSA
apksigner SHA256withEC

代碼詳見com.android.apksig.internal.apk.v1.V1SchemeSigner:

public static DigestAlgorithm getSuggestedSignatureDigestAlgorithm(PublicKey signingKey, int minSdkVersion)
  throws InvalidKeyException
{
  String keyAlgorithm = signingKey.getAlgorithm();
  if ("RSA".equalsIgnoreCase(keyAlgorithm))
  {
    if (minSdkVersion < 18) {
      return DigestAlgorithm.SHA1;
    }
    return DigestAlgorithm.SHA256;
  }
  if ("DSA".equalsIgnoreCase(keyAlgorithm))
  {
    if (minSdkVersion < 21) {
      return DigestAlgorithm.SHA1;
    }
    return DigestAlgorithm.SHA256;
  }
  if ("EC".equalsIgnoreCase(keyAlgorithm))
  {
    if (minSdkVersion < 18) {
      throw new InvalidKeyException("ECDSA signatures only supported for minSdkVersion 18 and higher");
    }
    return DigestAlgorithm.SHA256;
  }
  throw new InvalidKeyException("Unsupported key algorithm: " + keyAlgorithm);
}  

關(guān)于ApkSigner更多信息视哑,請(qǐng)戳~

0x06 升級(jí)簽名算法為SHA-2

綜上所示,我們可以知道App使用簽名算法的地方有兩處誊涯,分別是:

  1. 使用keytools生成keystore時(shí)指定的算法挡毅。
  2. 使用jarsigner/apksigner和keystore對(duì)app進(jìn)行簽名時(shí)指定的算法。

這里我們不修改簽名文件keystore的簽名算法暴构,我們只修改簽名App時(shí)使用的簽名算法為SHA-2跪呈,鑒于上面的原因我們需要升級(jí)android app的minSdkVersion >= 18段磨,下面介紹兩種升級(jí)SHA-2的方法:

  • 升級(jí)buildToolsVersion的版本大于等于24.0.3,gradle打包時(shí)會(huì)自動(dòng)調(diào)用apksigner使用SHA256withRSA對(duì)app進(jìn)行簽名耗绿。
  • 使用jarsigner對(duì)app進(jìn)行簽名苹支,然后在命令參數(shù)中直接指定簽名算法即可。

0x07 遺留問題

由于keystore未發(fā)生變化误阻,所以使用不同簽名算法的app是可以互相覆蓋的债蜜,故而攻擊者也可以使用舊版本的apk(使用SHA-1)覆蓋新版本apk(使用SHA-2)繼續(xù)進(jìn)行攻擊,所以為了避免被攻擊者進(jìn)行攻擊的最好更換keystore究反,但是這樣就沒法覆蓋安裝了寻定,詳細(xì)請(qǐng)參考things-that-cannot-change

0x08 參考引用

  1. Announcing the first SHA1 collision
  2. SHA1 collision Two PDF
  3. things-that-cannot-change
  4. SHA-1
  5. Shadows Everywhere
  6. apksigner
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末精耐,一起剝皮案震驚了整個(gè)濱河市狼速,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卦停,老刑警劉巖向胡,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沫浆,居然都是意外死亡捷枯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門专执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淮捆,“玉大人,你說我怎么就攤上這事本股∨嗜” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵拄显,是天一觀的道長(zhǎng)苟径。 經(jīng)常有香客問我,道長(zhǎng)躬审,這世上最難降的妖魔是什么棘街? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮承边,結(jié)果婚禮上遭殉,老公的妹妹穿的比我還像新娘。我一直安慰自己博助,他們只是感情好险污,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般蛔糯。 火紅的嫁衣襯著肌膚如雪拯腮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天蚁飒,我揣著相機(jī)與錄音动壤,去河邊找鬼。 笑死飒箭,一個(gè)胖子當(dāng)著我的面吹牛狼电,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弦蹂,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼强窖!你這毒婦竟也來了凸椿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤翅溺,失蹤者是張志新(化名)和其女友劉穎脑漫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咙崎,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡优幸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褪猛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片网杆。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伊滋,靈堂內(nèi)的尸體忽然破棺而出碳却,到底是詐尸還是另有隱情,我是刑警寧澤笑旺,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布昼浦,位于F島的核電站,受9級(jí)特大地震影響筒主,放射性物質(zhì)發(fā)生泄漏关噪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一乌妙、第九天 我趴在偏房一處隱蔽的房頂上張望使兔。 院中可真熱鬧,春花似錦冠胯、人聲如沸火诸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽置蜀。三九已至奈搜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盯荤,已是汗流浹背馋吗。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秋秤,地道東北人宏粤。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灼卢,于是被迫代替她去往敵國(guó)和親绍哎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 對(duì)于 Android 開發(fā)者而言鞋真, APK 簽名的重要性不言而喻崇堰。Android 7.0 后 APK 簽名已經(jīng)從基...
    Cavabiao閱讀 9,876評(píng)論 7 30
  • 1. Android 的簽名保護(hù)機(jī)制到底是什么? Android 系統(tǒng)禁止更新安裝簽名不一致的 Apk涩咖,如果我們修...
    騰訊bugly閱讀 2,677評(píng)論 0 2
  • “我最崇拜的人,是我自己 只有我才會(huì)幫自己闸昨,度過一山又一山 克服一次又一次難關(guān)” 致唐晶蚯斯!????? 《我的前半生...
    舒酥閱讀 576評(píng)論 0 0
  • 像霧 輕盈,飄逸零院,靈動(dòng) 一會(huì)飄散 一會(huì)聚攏 不變的是初心 像雨 飄飄灑灑 滋潤(rùn)萬物大地 能托住它的只有云 像風(fēng) 喜...
    candy555閱讀 195評(píng)論 0 0