成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用密碼學(xué)技術(shù)保護(hù)敏感信息

安全 數(shù)據(jù)安全
從去年Google I/O大會(huì)上討論了“Android應(yīng)用的安全和隱私”以來,很多人對(duì)如何在Android上使用密碼學(xué)技術(shù)有些疑問。大多數(shù)問題都是圍繞在為了某一特定目的該使用哪一個(gè)API上。因此,我們?cè)谶@里就是來探討一下如何在本地存儲(chǔ)中保護(hù)用戶的敏感信息,比如說密碼和auth token.

從去年Google I/O大會(huì)上討論了“Android應(yīng)用的安全和隱私”以來,很多人對(duì)如何在Android上使用密碼學(xué)技術(shù)有些疑問。大多數(shù)問題都是圍繞在為了某一特定目的該使用哪一個(gè)API上。因此,我們?cè)谶@里就是來探討一下如何在本地存儲(chǔ)中保護(hù)用戶的敏感信息,比如說密碼和auth token(【譯者】授權(quán)標(biāo)記,這里直接用auth token更自然)。

一種反模式(錯(cuò)誤的做法——譯者注)

通常我們都能意識(shí)到應(yīng)該使用SecureRandom類來產(chǎn)生密鑰,用來對(duì)本地的敏感信息進(jìn)行加密,這樣的例子很容易找到,但實(shí)際上這種做法是欠妥的。

在這種方法中,不將密鑰作為一個(gè)字符串直接存儲(chǔ)在APK文件中,而是通過另外一個(gè)字符串來生成密鑰–有點(diǎn)類似于通過用戶口令生成加密密鑰。這種必要的混淆手段可以使攻擊者不容易破解加密信息,但是對(duì)于一個(gè)有經(jīng)驗(yàn)的攻擊者而言,這種策略很容易被繞過,因此我們不推薦這種方法。

事實(shí)上,Android現(xiàn)有的安全機(jī)制中已經(jīng)為這種數(shù)據(jù)提供了很好的保護(hù),敏感數(shù)據(jù)應(yīng)該標(biāo)記上MODE_PRIVATE,然后存儲(chǔ)在內(nèi)部存儲(chǔ)中,請(qǐng)注意,千萬不能存儲(chǔ)在SD卡中,因?yàn)樵L問控制沒法強(qiáng)制在外部存儲(chǔ)上起作用。

結(jié)合設(shè)備加密措施,這種方法可以杜絕絕大部分攻擊。

除此之外,像我們上面描述的那樣使用SecureRandom類還存在另外一個(gè)問題。從Android4.2開始,SecureRandom的默認(rèn)實(shí)現(xiàn)是OpenSSL,開發(fā)者無法覆蓋SecureRandom的內(nèi)部狀態(tài)信息,例如下面這段代碼:

  1. SecureRandom secureRandom = new SecureRandom();    
  2. byte[] b = new byte[]{(byte)1};    
  3. secureRandom.setSeed(b);    
  4. //在Android4.2上,下面這行代碼總是返回同一個(gè)數(shù)字。  
  5. System.out.println(secureRandom.nextInt());   

(【譯者注】這段代碼可以看到通過程序覆蓋了random對(duì)象中的種子,造成每次生成的隨機(jī)數(shù)序列都是一樣的)

在以前的Android版本中,SecureRandom是基于Bouncy Castle實(shí)現(xiàn)的,它允許像上面代碼這樣的操作,每個(gè)SecureRandom類的實(shí)例產(chǎn)生偽隨機(jī)數(shù)時(shí)使用的種子是從/dev/urandom獲取的。(【譯者注】/dev/urandom是類Unix系統(tǒng)中根據(jù)當(dāng)前計(jì)算機(jī)混亂狀態(tài),如內(nèi)存使用,CPU占用率等信息計(jì)算出來的隨機(jī)數(shù),讀者可以在Linux下試試cat /dev/urandom,它會(huì)不停地輸出亂碼,一般用“熵”這個(gè)專業(yè)術(shù)語形容計(jì)算機(jī)的混亂狀態(tài))。那些試圖使用產(chǎn)生隨機(jī)數(shù)的開發(fā)者通常是通過替換現(xiàn)有的種子來產(chǎn)生隨機(jī)數(shù)序列的(參考相關(guān)實(shí)現(xiàn)文檔),如果種子固定,那么產(chǎn)生的隨機(jī)數(shù)列就是可預(yù)測(cè)的,這一點(diǎn)是不安全的。現(xiàn)在通過OpenSSL實(shí)現(xiàn),使得這種錯(cuò)誤的行為不再可能出現(xiàn)。

不幸的是,那些依賴?yán)系腟ecureRandom類的應(yīng)用程序會(huì)發(fā)現(xiàn)每次程序啟動(dòng)時(shí)產(chǎn)生的隨機(jī)數(shù)都不一樣了(事實(shí)上,這就應(yīng)該是隨機(jī)數(shù)發(fā)生器的期望行為)。想要通過這種方法對(duì)加密密鑰混淆已經(jīng)不可行了。

(【譯者注】原作者的意思是有些應(yīng)用對(duì)敏感信息做加密,加密的話需要密鑰,但是密鑰如果直接存起來覺得很不放心,于是通過產(chǎn)生隨機(jī)數(shù)的方式來對(duì)密鑰混淆一下,那么每次程序啟動(dòng)時(shí)都要用相同的密鑰去解密數(shù)據(jù),于是通過一個(gè)固定的信息,比如一個(gè)密碼,或者記住某個(gè)隨機(jī)數(shù)字,通常很多人用當(dāng)前時(shí)間,然后通過這個(gè)固定的信息作為種子產(chǎn)生隨機(jī)數(shù),用這個(gè)隨機(jī)數(shù)做密鑰,相當(dāng)于對(duì)這個(gè)固定信息做了一次混淆操作。實(shí)際上這種方法還是不安全,安全性就變成了如何保證這個(gè)種子的安全性,治標(biāo)不治本。下面的部分作者的意思是應(yīng)該直接將密鑰打上MODE_PRIVATE的標(biāo)記存起來,通過系統(tǒng)的訪問控制機(jī)制保證密鑰的安全性。)

正確的方法

一種更加合理的解決方案很簡(jiǎn)單,就是當(dāng)應(yīng)用程序第一次啟動(dòng)時(shí)產(chǎn)生一個(gè)隨機(jī)的AES算法的密鑰:

  1. public static SecretKey generateKey() throws NoSuchAlgorithmException   
  2. {       
  3. // 生成一個(gè)256位密鑰       
  4. final int outputKeyLength = 256;         
  5. SecureRandom secureRandom = new SecureRandom();  
  6. // Do *not* seed secureRandom! Automatically seeded from system entropy.   
  7. //不要給secureRandom一個(gè)固定的種子!通過系統(tǒng)熵值產(chǎn)生隨機(jī)的種子     
  8. KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");     
  9. keyGenerator.init(outputKeyLength, secureRandom);       
  10. SecretKey key = keyGenerator.generateKey();       
  11. return key;   
  12. }  

注意這種方法的安全性依賴于如何保證密鑰的安全性,這可以依賴于Android系統(tǒng)的內(nèi)部存儲(chǔ)的安全性。將密鑰直接存放在文件中,標(biāo)記為MODE_PRIVATE存在內(nèi)部存儲(chǔ)器。(【譯者注】我們很多人的Android手機(jī)都被Root過的,好多應(yīng)用也會(huì)取得Root權(quán)限,Root權(quán)限用戶是可以做任何事情的。。。這怎么辦呢?)

更加安全的方法

如果你的應(yīng)用還需要額外的加密操作,那么一個(gè)推薦的方法是每次進(jìn)入你的應(yīng)用時(shí)需要輸入一個(gè)口令或者PIN碼。然后將這個(gè)口令傳給 PBKDF2(PBKDF2,基于口令的密鑰導(dǎo)出函數(shù)版本2,是RSA安全公司提出的密鑰導(dǎo)出算法,通常用來根據(jù)口令取得密鑰,通過一種叫做密鑰拉伸的專業(yè)技術(shù)),Android在SecretKeyFactory類中提供了一個(gè)叫做PBKDF2WithHmacSHA1的實(shí)現(xiàn):

  1. public static SecretKey generateKey(char[] passphraseOrPin, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException   
  2. {  
  3. //PBKDF2算法執(zhí)行輪數(shù),這個(gè)數(shù)字越大,計(jì)算時(shí)間越長(zhǎng),你應(yīng)該讓這個(gè)數(shù)字       
  4. //足夠大,以至于這個(gè)算法執(zhí)行時(shí)間超過100毫秒以保證安全性       
  5. final int iterations = 1000;         
  6. // 產(chǎn)生一個(gè)256位的密鑰       
  7. final int outputKeyLength = 256;         
  8. SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");       
  9. KeySpec keySpec = new PBEKeySpec(passphraseOrPin, salt, iterations, outputKeyLength);       
  10. SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);       
  11. return secretKey;   

加密鹽應(yīng)該是一個(gè)通過SecureRandom產(chǎn)生的隨機(jī)字符串,和加密密文一起存放在內(nèi)部存儲(chǔ)器中。使用加密鹽很重要,它可以有效防止字典攻擊。

(【譯者注】看PBKDF2WithHmacSHA1這個(gè)名字也可以知道該算法是基于SHA1算法的,經(jīng)常攻擊這種單向函數(shù)方法就是字典攻擊,預(yù)先計(jì)算好大量的明文對(duì)應(yīng)的密文,就像是明文對(duì)應(yīng)密文的字典,然后再進(jìn)行逐一對(duì)比,如果明文字符串在加密前和一個(gè)隨機(jī)字符串做個(gè)連接操作,那么那些預(yù)先計(jì)算的字典救沒用了。)

檢查你的應(yīng)用是不是正確的使用SecureRandom

如本文以及Jelly Bean的新安全特性所述,Android4.2的SecureRandom默認(rèn)實(shí)現(xiàn)發(fā)生了變化,用它產(chǎn)生固定密鑰已經(jīng)行不通了。

如果你也用了這種錯(cuò)誤方法的話,我們建議現(xiàn)在就更新你的應(yīng)用,防止當(dāng)用戶升級(jí)到Android4.2或以上版本后發(fā)生一些莫名其妙的錯(cuò)誤。

原文地址:http://www.importnew.com/3456.html

責(zé)任編輯:藍(lán)雨淚 來源: importnew
相關(guān)推薦

2018-03-09 17:36:27

2020-05-20 08:35:55

公鑰密碼學(xué)非對(duì)稱密碼密碼

2017-06-01 09:03:51

2017-01-03 16:03:56

2017-12-14 16:02:43

2011-07-30 13:16:20

2012-12-03 10:59:30

2021-07-26 10:34:47

物聯(lián)網(wǎng)密碼學(xué)IoT

2020-08-13 18:19:24

OpenSSL密碼學(xué)Linux

2020-12-19 10:38:22

量子計(jì)算密碼學(xué)加密

2023-05-07 08:00:32

2015-10-08 15:07:32

2011-07-19 13:59:59

2018-12-07 08:15:03

2011-07-19 13:55:38

2022-06-16 14:04:14

密碼學(xué)加密后量子密碼學(xué)

2020-10-07 16:44:27

量子計(jì)算

2019-09-29 19:12:13

區(qū)塊鏈密碼學(xué)技術(shù)零知識(shí)證明

2024-01-10 16:31:55

2022-06-09 08:00:00

量子密碼學(xué)安全量子計(jì)算機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美一级精品片在线看 | 一区二区三区四区不卡视频 | 国产精品亚洲欧美日韩一区在线 | 三级黄视频在线观看 | 欧美成人aaa级毛片在线视频 | 一区二区三区视频在线观看 | 在线色网| 午夜视频在线播放 | 成人国产免费视频 | 日韩福利视频 | 中文字幕高清免费日韩视频在线 | 亚洲永久 | 四虎永久免费在线 | 97色在线观看免费视频 | 黄网在线观看 | 在线观看亚 | 国产免费一区二区 | 国产你懂的在线观看 | 成人激情免费视频 | 久久av网站 | 国产欧美精品一区二区色综合朱莉 | 九九精品网| 日韩视频在线播放 | 国产午夜精品视频 | 日韩精品在线免费观看视频 | 久久综合久久久 | 日韩综合在线 | 日韩欧美在线一区 | 午夜视频在线 | 亚洲狠狠丁香婷婷综合久久久 | 综合久久久久久久 | 看片国产 | 日日碰狠狠躁久久躁婷婷 | 日本在线播放一区二区 | 国产精品观看 | 97中文视频 | 欧美一区二区成人 | 日韩亚洲一区二区 | 亚洲视频精品 | 久久丝袜视频 | 日日艹夜夜艹 |