版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——Android和服务器端实现加密通信
Android和服务器端实现加密通信
本文使用JAVA自带的RSA算法在Adroid和服务器端之间实现加密通信,同时描述了在该过程中可能会面临的三个常见问题以及解决方法。
一、问题的提出
移动开发如火如荼,好多APP都需要联网与服务器端进行数据交互,有些时候APP和服务器端之间交互的是一些私密数据,譬如用户的个人资料,此时需要进行加密交互以免数据泄露。
二、解决思路
1.使用RSA算法进行加密和签名
RSA是目前最有影响力的公钥加密算法,它能够抗争到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密。
RSA作为一种非对称加密机制,用于AndroidAPP和服务器端之间的通信加密是比较适合的,APP端存在用户手机上可以使用公钥进行消息加密和认证,而私钥则存在服务器上,服务器端使用私钥进行解密和签名,即使有人在Android手机上反编译了APP端代码也只能获得公钥,既无法利用来窃取其他用户的信息也无法仿冒服务器端的重要消息。
JAVA的加密库已经实现了RSA算法,因此无论是在App端还是服务器端都只需要调用JAVA的库函数来生成一对密钥(公钥,私钥),并在服务器端用私钥解密,私钥签名,在App端用公钥加密,公钥认证。
2.可能会出现的问题
采用以上方案可能会出现如下三个问题:
(1).Android系统上JAVA库的RSA实现方法和其他系统上JAVA库的RSA实现不完全一致,因此往往会出现Android系统之后信息,传到服务器端却解码失败的状况。这个问题不仅仅是RSA算法,Java加密库的其他算法(例如AES)也存在类似问题。
解决方法:要解决这个问题,需要在服务器端引进一个与andoird实现方法一致的jar包(bcprov-jdk15on-148.jar)作为安全策略,然后在代码中添加这种安全策略,并且用这种安全策略来初始化加密库。代码如下:
第1页
privatestaticCiphercipher;static{try{
Security.addProvider(new
vider.BouncyCastleProvider());//添加安全策略cipher=Cipher.getInstance(\,\);//用该安全策略初始化加密库
}catch(NoSuchAlgorithmExceptione){e.printStackTrace();
}catch(NoSuchPaddingExceptione){e.printStackTrace();
}catch(NoSuchProviderExceptione){
}
//TODOAuto-generatedcatchblocke.printStackTrace();
(2)要加密的明文过长,导致加密失败。RSA算法要求加密明文的长度不能大于密钥长度,因此一旦加密明文过长会报加密失败。
解决方法:根据密钥长度对明文进行分组,然后每组分别加密,最终将加密结果拼接在一起,由于分组之后每组长度都小于密钥长度保证加密成功。对应的,在解密时,对密文也进行分组(根据RSA算法,每组密文的长度一定等于密钥的长度),然后对每组密钥分别解密,最终将所有解密之后的明文拼接起来得到最终结果。
(3)JAVA加密库加密之后得到的密文是一串二进制码流,假使想在Http中正常传输最好要转化为ASCII字符,否则可能会发生乱码问题。
解决方法:采用BASE64算法,RSA加密后再用BASE64算法进行编码,在RSA解密之前先用BASE64算法进行解码,由于BASE64编码后的字符都是ASCII字符,因此可以毫无问题的用Http传输。这里要注意的是android库自带了Base64编码的实现类,服务器端可能需要引进外部的实现包。
三、实践状况
采用以上方案,一步步规避三个常见问题,最终成功实现了Android和服务器端之间的加密通信,实现服务器端代码如下(Andoroid端只需要将私钥换成公钥,使用默认安全策略来初始化加密库即其次个参数为空,Base64使用android自带的Base64类即可):
publicclassRSAImpl{
privatestaticCiphercipher;
static{
第2页
try{
Security.addProvider(new
vider.BouncyCastleProvider());cipher=Cipher.getInstance(\,\);}catch(NoSuchAlgorithmExceptione){e.printStackTrace();
}catch(NoSuchPaddingExceptione){e.printStackTrace();
}catch(NoSuchProviderExceptione){/**
*生成密钥对
*@paramfilePath生成密钥的路径*@return*/
publicstaticMapgenerateKeyPair(StringfilePath){try{
KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance(\,new
vider.BouncyCastleProvider());
//密钥位数
keyPairGen.initialize(1024);
//密钥对
KeyPairkeyPair=keyPairGen.generateKeyPair();
//公钥
PublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();//私钥PrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();//得到公钥字符串
StringpublicKeyString=getKeyString(publicKey);//得到私钥字符串
StringprivateKeyString=getKeyString(privateKey);//将密钥对写入到文件FileWriterpubfw=new
FileWriter(filePath+\);FileWriterprifw=new
FileWriter(filePath+\);
BufferedWriterpubbw=newBufferedWriter(pubfw);BufferedWriterpribw=newBufferedWriter(prifw);
//TODOAuto-generatedcatchblocke.printStackTrace();
}
}
第3页
pubbw.write(publicKeyString);pribw.write(privateKeyString);pubbw.flush();pubbw.close();pubfw.close();pribw.flush();pribw.close();prifw.close();
//将生成的密钥对返回
Mapmap=newHashMap();map.put(\,publicKeyString);map.put(\,privateKeyString);returnmap;
}catch(Exceptione){e.printStackTrace();}
returnnull;}/***得到公钥*
*@paramkey
*密钥字符串(经过base64编码)*@throwsException*/
publicstaticPublicKeygetPublicKey(Stringkey)throwsException{byte[]keyBytes;
keyBytes=(newBASE64Decoder()).decodeBuffer(key);
X509EncodedKeySpeckeySpec=newX509EncodedKeySpec(keyBytes);KeyFactorykeyFactory=KeyFactory.getInstance(\);PublicKeypublicKey=keyFactory.generatePublic(keySpec);returnpublicKey;}/***得到私钥*
*@paramkey
*密钥字符串(经过base64编码)*@throwsException*/
publicstaticPrivateKeygetPrivateKey(Stringkey)throwsException{
第4页
byte[]keyBytes;
keyBytes=(newBASE64Decoder()).decodeBuffer(key);
PKCS8EncodedKeySpeckeySpec=newPKCS8EncodedKeySpec(keyBytes);KeyFactorykeyFactory=KeyFactory.getInstance(\);PrivateKeyprivateKey=keyFactory.generatePrivate(keySpec);returnprivateKey;}/**
*得到密钥字符串(经过base64编码)*
*@return*/
publicstaticStringgetKeyString(Keykey)throwsException{byte[]keyBytes=key.getEncoded();
Strings=(newBASE64Encoder()).encode(keyBytes);returns;}/**
*使用keystore对明文进行加密
*@paramprivateKeystore私钥路径*@paramplainText明文*@return*/
publicstaticStringencryptbyPrivateKey(String
priva
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宝鸡文理学院《模拟招聘》2022-2023学年第一学期期末试卷
- 木浆板文具相关项目建议书
- 【初中化学】酸碱盐方程式以及反应规律(收藏学习)
- 投币启动设备用机械装置市场环境与对策分析
- 喷香水器市场环境与对策分析
- 抗组胺剂项目评价分析报告
- 描图布项目可行性实施报告
- 开酒器相关项目实施方案
- 调车组试题百题
- 什么是数据架构(华为)
- 美的历程李泽厚
- 中职英语基础模块3期末考试试卷试题及答案
- 人教版小学数学一年级《数的顺序比较大小》PPT教学课件
- 第六章-复合材料课件
- 七大洲与四大洋课件
- 医院关于成立创伤中心救治团队的通知
- 高中数学必修三《程序框图》教学课件
- 深度访谈技巧课件
- 北师大八年级上册数学期中知识点梳理
- 创新课堂教学模式提升初中生数学自主学习能力-讲座课件
- 防溺水、防性侵、防欺凌安全教育家长会
评论
0/150
提交评论