深入理解Android MD5数据加密
MD5加密
MD5是由MD2、MD3、MD4演变过来的,虽然MD5加密算法现在有些人已经将其解开了,但是它的加密机制依然很强大,我想绝大对数还是不会解开的。MD5加密算法是单向加密,是不可逆的一种的加密方式,只能用你的密码才能解开,要不就是会解密算法,否则想都别想解开。
MD5加密的特点
压缩性:任意长度的数据,算出的MD5值长度都是固定的。
容易计算:从原数据计算出MD5值很容易。
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5应用场景
一致性验证
数字签名
安全访问认证
MD5加密算法实现
1.)计算字符串MD5值
publicstaticStringmd5(Stringstring){ if(TextUtils.isEmpty(string)){ return""; } MessageDigestmd5=null; try{ md5=MessageDigest.getInstance("MD5"); byte[]bytes=md5.digest(string.getBytes()); Stringresult=""; for(byteb:bytes){ Stringtemp=Integer.toHexString(b&0xff); if(temp.length()==1){ temp="0"+temp; } result+=temp; } returnresult; }catch(NoSuchAlgorithmExceptione){ e.printStackTrace(); } return""; }
2.)计算文件的MD5值
//计算文件的MD5值 publicstaticStringmd5(Filefile){ if(file==null||!file.isFile()||!file.exists()){ return""; } FileInputStreamin=null; Stringresult=""; bytebuffer[]=newbyte[8192]; intlen; try{ MessageDigestmd5=MessageDigest.getInstance("MD5"); in=newFileInputStream(file); while((len=in.read(buffer))!=-1){ md5.update(buffer,0,len); } byte[]bytes=md5.digest(); for(byteb:bytes){ Stringtemp=Integer.toHexString(b&0xff); if(temp.length()==1){ temp="0"+temp; } result+=temp; } }catch(Exceptione){ e.printStackTrace(); }finally{ if(null!=in){ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } } } returnresult; }
或者采用nio的方式
publicstaticStringmd5(Filefile){ Stringresult=""; FileInputStreamin=null; try{ in=newFileInputStream(file); MappedByteBufferbyteBuffer=in.getChannel().map(FileChannel.MapMode.READ_ONLY,0,file.length()); MessageDigestmd5=MessageDigest.getInstance("MD5"); md5.update(byteBuffer); byte[]bytes=md5.digest(); for(byteb:bytes){ Stringtemp=Integer.toHexString(b&0xff); if(temp.length()==1){ temp="0"+temp; } result+=temp; } }catch(Exceptione){ e.printStackTrace(); }finally{ if(null!=in){ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } } } returnresult; }
MD5加密安全性探讨:
虽然说MD5加密本身是不可逆的,但并不是不可破译的,网上有关MD5解密的网站数不胜数,破解机制采用穷举法,就是我们平时说的跑字典。所以如何才能加大MD5破解的难度呢?
1.)对字符串多次MD5加密
publicstaticStringmd5(Stringstring,inttimes){ if(TextUtils.isEmpty(string)){ return""; } Stringmd5=md5(string); for(inti=0;i<times-1;i++){ md5=md5(md5); } returnmd5(md5); }
2.)MD5加盐
加盐的方式也是多种多样
string+key(盐值key)然后进行MD5加密
用string明文的hashcode作为盐,然后进行MD5加密
随机生成一串字符串作为盐,然后进行MD5加密
publicstaticStringmd5(Stringstring,Stringslat){ if(TextUtils.isEmpty(string)){ return""; } MessageDigestmd5=null; try{ md5=MessageDigest.getInstance("MD5"); byte[]bytes=md5.digest((string+slat).getBytes()); Stringresult=""; for(byteb:bytes){ Stringtemp=Integer.toHexString(b&0xff); if(temp.length()==1){ temp="0"+temp; } result+=temp; } returnresult; }catch(NoSuchAlgorithmExceptione){ e.printStackTrace(); } return""; }
总结
以上就是关于AndroidMD5数据加密的全部内容,希望能对Android开发者们有所帮助,如有疑问大家可以留言交流。