深入理解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开发者们有所帮助,如有疑问大家可以留言交流。