楊新宇
摘要:谷歌推出的安卓平臺以其良好的開放性和靈活性贏得廣大消費(fèi)者的歡迎。文章針對安卓手機(jī)的移動(dòng)社交軟件中存在的安全隱患,以保護(hù)用戶個(gè)人通信的隱私,提高短信傳輸?shù)目煽啃约鞍踩詾槟康?,研究了在Android平臺上對字符串進(jìn)行加密和簽名認(rèn)證的方法。設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)加密和簽名認(rèn)證的通信系統(tǒng),該系統(tǒng)用AES加密算法實(shí)現(xiàn)對字符串的加密,用RSA簽名算法實(shí)現(xiàn)對字符串的簽名和驗(yàn)證。具有良好的兼容性和實(shí)用性,在系統(tǒng)中添加了短信發(fā)送功能,更加方便了用戶使用。
關(guān)鍵詞:Android系統(tǒng);AES算法;RSA算法;信息安全
1 引言
云計(jì)算技術(shù)隨著大數(shù)據(jù)時(shí)代的到來不斷發(fā)展,人們通過網(wǎng)絡(luò)方便地進(jìn)行信息交流,隨之而產(chǎn)生的移動(dòng)社交軟件也層出不窮。諸如QQ、微信、微博、短信等早已深入到人們的日常生活之中。人們享受便利與高效通信的同時(shí),伴隨而來的安全問題正時(shí)刻困擾著我們?!袄忡R門”等類似事件也在不斷向我們敲響警鐘,即在雙方利用手機(jī)進(jìn)行通信時(shí),社交軟件公司、互聯(lián)網(wǎng)運(yùn)營商等都有技術(shù)來獲得用戶通信內(nèi)容。就目前來看,主要存在著以下隱患:(1)編輯的字符串以明文形式發(fā)送,在不安全的信道中傳輸,字符串內(nèi)容可能被惡意第三方獲知。(2)接收方無法對字符串的發(fā)送者進(jìn)行身份鑒別,發(fā)送方可以抵賴,單憑賬號和手機(jī)號已經(jīng)缺乏可靠性。(3)接收方對字符串內(nèi)容的完整性不能鑒別,無法獲知該內(nèi)容是否被他人篡改。
因此,在使用移動(dòng)社交軟件時(shí)如何將用戶的隱私控制在用戶自己手中,如何提高用戶信息的安全性顯得至關(guān)重要。為此,本文以安卓手機(jī)為例,結(jié)合安卓手機(jī)短信的運(yùn)行機(jī)制,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)針對社交時(shí)敏感字符串的簽名、加密通信系統(tǒng),用戶可對字符串進(jìn)行簽名驗(yàn)證、加密解密。其特點(diǎn)如下:具有較強(qiáng)的實(shí)用性;具有較好的兼容性;具有一定的安全性;保證了字符串的可信性、不可抵賴性和數(shù)據(jù)完整性;操作簡單方便。
2 系統(tǒng)設(shè)計(jì)
2.1系統(tǒng)模型
整個(gè)系統(tǒng)模型可分為3層,其中安卓平臺作為底層,移動(dòng)社交軟件作為中間層,通信系統(tǒng)作為頂層。圖1是系統(tǒng)的設(shè)計(jì)模型。
安卓平臺作為底層包括了應(yīng)用層、應(yīng)用框架層、系統(tǒng)運(yùn)行庫層和Linux內(nèi)核層,該層提供基本的功能支持,如連接互聯(lián)網(wǎng),獲取SIM信息等。社交軟件層包括了用戶常用的各種社交軟件,在該層點(diǎn)擊“發(fā)送”按鍵后,信息交由底層發(fā)送至信道中,接收方獲得密文后也是在該層顯示出來。通信系統(tǒng)層為字符串提供加密、簽名、簽名加密三種功能(簽名加密是將前兩種功能結(jié)合起來一并使用),具體使用哪種由用戶自己選擇。
2.2系統(tǒng)模塊
本系統(tǒng)主要分為3個(gè)模塊。分別是發(fā)送接收模塊、加密解密模塊、簽名驗(yàn)證模塊。圖2展現(xiàn)了各模塊之間的關(guān)聯(lián)。
其中發(fā)送接收模塊提供了短信的發(fā)送和接收功能。通過該模塊不需要借助于移動(dòng)社交軟件就可以直接進(jìn)行字符數(shù)據(jù)的傳輸,為使用短信通信提供了便利。在發(fā)送前,系統(tǒng)會通過判斷語句對短信字符長度進(jìn)行判斷,如果消息長度超過70個(gè)字符,短信會自動(dòng)分為兩條發(fā)送。當(dāng)然用戶也可以通過復(fù)制粘貼的方式將密文導(dǎo)入安卓手機(jī)自帶的短信發(fā)送軟件中實(shí)現(xiàn)發(fā)送。
加密解密模塊采用對稱加密中的AES算法。在眾多加密方法中,對稱加密具有加密速度快、加密數(shù)據(jù)量大的優(yōu)點(diǎn),適合在字符串長度較長的情況下進(jìn)行加密。而其中的AES算法也是當(dāng)前較為常用的一種加密算法,該加密算法采用分組加密的方式,共有128bit、192bit和256bit三種分組長度,這里采用256bit。在通信前輸入對稱密鑰,編輯字符串,完成加密。復(fù)制粘貼到用戶使用的社交軟件對話框中,點(diǎn)擊發(fā)送便完成了密文的傳輸。接收方在社交軟件對話框中看到密文后,將密文導(dǎo)入系統(tǒng)中,輸入對稱密鑰進(jìn)行解密。
簽名驗(yàn)證模塊采用RSA算法,該算法在數(shù)字簽名中使用較為廣泛。為了保證在計(jì)算上的困難性,密鑰長度至少在1024bit。
3 系統(tǒng)實(shí)現(xiàn)
本系統(tǒng)在安卓系統(tǒng)2.3.3版本上進(jìn)行設(shè)計(jì),該版本在市場上出現(xiàn)較早。
3.1系統(tǒng)流程
1.密鑰分發(fā)。(1)AES密鑰:手工分發(fā)、RSA加密分發(fā)。(2)RSA公鑰:短信發(fā)送、互聯(lián)網(wǎng)發(fā)布。
2.AES加密發(fā)送短信。(1)輸入密碼、短信內(nèi)容和電話號碼。(2)對短信內(nèi)容加密。(3)發(fā)送密文。
3.RSA簽名發(fā)送短信。(1)輸入短信文本。(2)對原文簽名生成消息摘要。(3)輸入AES加密密鑰,對消息摘要和明文加密形成密文。(4)發(fā)送密文。
3.2功能實(shí)現(xiàn)
1.置布局文件。
使用線性布局作為整體的布局框架。首先界面上要有輸入密碼,輸入短信字符串及輸入電話號碼的可編輯文本框,其次一個(gè)加密的按鈕點(diǎn)擊后實(shí)現(xiàn)加密,一個(gè)解密按鈕點(diǎn)擊后實(shí)現(xiàn)解密,一個(gè)發(fā)送按鈕發(fā)送短信,以及一個(gè)返回按鈕結(jié)束程序。整個(gè)布局采用線性布局,里面再嵌套兩個(gè)線性布局。至于簽名驗(yàn)證模塊的布局原理類似,不加以贅述。圖3為加密解密模塊的布局效果圖。
2.發(fā)送功能。
(1)系統(tǒng)具備發(fā)送短信的功能,在AndroidManifest.xml文件中需要添加發(fā)送短信的權(quán)限
(2)將Android中自帶的telephony.SmsManager類導(dǎo)入。
(3)設(shè)置監(jiān)聽器監(jiān)聽事件btnSend.setOnClickListener(new OnClickListener(),一旦觸發(fā),立即讀取短信字符串和手機(jī)號碼字符串。
(4)發(fā)送短信smsManager.sendTextMessage(mobile, null, msg, null, null),彈出提示框“短信已發(fā)送”。
3.加密解密功能。
(1)調(diào)用加密函數(shù)AESCipher類進(jìn)行加密
dest = AESCipher.encrypt(key, src)
(2)加密函數(shù)
public class AESCipher {public static String encrypt(String key, String src) throws Exception {
byte[] rawKey = getRawKey(key.getBytes());
byte[] result = encrypt(rawKey, src.getBytes());
return toHex(result); }
(3)加密流程
字符數(shù)據(jù)轉(zhuǎn)化為字節(jié)數(shù)據(jù)。
src = etStr.getText().toString().trim()
字節(jié)數(shù)據(jù)轉(zhuǎn)化為十六進(jìn)制字符串
public static String toHex(String txt)
{return toHex(txt.getBytes()); }
圖5、圖6分別為原文加密后的應(yīng)用界面。
(4)解密
解密時(shí)調(diào)用相應(yīng)的解密函數(shù):
dest = AESCipher.decrypt(key, src)
4.簽名驗(yàn)證功能。
(1)密鑰生成
生成公私密鑰對:
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA)
密鑰位數(shù)為1024位,keyPairGen.initialize(1024)。
動(dòng)態(tài)生成密鑰對,這是當(dāng)前最耗時(shí)的操作,一般要2s以上。
KeyPair keyPair = keyPairGen.generateKeyPair();
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
byte[] publicKeyData = publicKey.getEncoded();
byte[] privateKeyData = privateKey.getEncoded();
(2)簽名
用戶編輯完字符串后,將私鑰導(dǎo)入相應(yīng)的文本框中,點(diǎn)擊“簽名”按鈕。系統(tǒng)讀取字符串。
String content = txtInput.getText().toString()
RSA簽名函數(shù)對字符串完成簽名。
byte[] dataEncode=cipher.doFinal(content.getBytes());
最后經(jīng)Base64編碼后導(dǎo)入通信雙方的對話框中。
(3)驗(yàn)證
用戶從對話框中獲得簽名,經(jīng)過解碼后,導(dǎo)入發(fā)送方公鑰,點(diǎn)擊“驗(yàn)證”按鈕。主要代碼如下:
byte[] miwen = content.getBytes();
byte[]=android.util.Base64.decode(miwen,Base64.DEFAULT);
byte[] dataDecode = cipher.doFinal(b);
4 結(jié)束語
本文就移動(dòng)社交網(wǎng)絡(luò)中傳遞的字符串加密和簽名方法進(jìn)行了研究和設(shè)計(jì),在使用社交軟件時(shí),通過本系統(tǒng)可對敏感信息進(jìn)行即時(shí)加密和簽名。即使被惡意第三方獲得了密文,也無法立即獲取信息內(nèi)容。接收方在獲得密文后同樣使用復(fù)制、粘貼的方式,將密文導(dǎo)入系統(tǒng)中完成解密、驗(yàn)證。在今后的工作中,可嘗試添加RSA公鑰加密模塊,實(shí)現(xiàn)對AES對稱密鑰的管理,在社交軟件群聊的信息傳遞模式中也可以實(shí)現(xiàn)安全的通信,不再局限于目前點(diǎn)對點(diǎn)的信息傳遞。