加密

package other;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/*
 * MD5 算法
*/
public class MD5 {
    
    // 全局数组
    private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    public MD5() {
    }

    // 返回形式为数字跟字符串
    private static String byteToArrayString(byte bByte) {
        int iRet = bByte;
        // System.out.println("iRet="+iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        int iD1 = iRet / 16;
        int iD2 = iRet % 16;
        return strDigits[iD1] + strDigits[iD2];
    }

    // 返回形式仅仅为数字
    private static String byteToNum(byte bByte) {
        int iRet = bByte;
        System.out.println("iRet1=" + iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        return String.valueOf(iRet);
    }

    // 转换字节数组为16进制字串
    private static String byteToString(byte[] bByte) {
        StringBuffer sBuffer = new StringBuffer();
        for (int i = 0; i < bByte.length; i++) {
            sBuffer.append(byteToArrayString(bByte[i]));
        }
        return sBuffer.toString();
    }

    public static String GetMD5Code(String strObj) {
        String resultString = null;
        try {
            resultString = new String(strObj);
            MessageDigest md = MessageDigest.getInstance("MD5");
            // md.digest() 该函数返回值为存放哈希值结果的byte数组
            resultString = byteToString(md.digest(strObj.getBytes()));
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        return resultString;
    }

    public static void main(String[] args) {
        MD5 getMD5 = new MD5();
        System.out.println(getMD5.GetMD5Code("000000"));
    }

}




经常使用加密算法的Java实现(一)

——单向加密算法MD5和SHA

日期:2014/6/1

文:阿蜜果

1、Java的安全体系架构

1.1           Java的安全体系架构介绍

Java中为安全框架提供类和接口JDK 安全 API Java 编程语言的核心 API,位于 java.security 包(及其子包),以及sun.securityAPI包(及其子包)中。

设计用于帮助开发者在程序中同一时候使用低级和高级安全功能。

JDK 1.1 中第一次公布的 JDK 安全中引入了“Java 加密体系结构(JCA)。指的是用于訪问和开发 Java 平台password功能的构架。在 JDK 1.1 中,JCA 包含用于数字签名和报文摘要 APIJDK 1.2 大大扩展了 Java 加密体系结构,它还对证书管理基础结构进行了升级以支持 X.509 v3 证书,并为划分仔细、可配置性强、功能灵活、可扩展的訪问控制引入了新的 Java 安全体系结构

Java 加密体系结构包括 JDK 1.2 安全 API 中与password有关的部分,以及本文档中提供的一组约定和规范。

为实现多重、可互操作的password。它还提供了“提供者”体系结构。

Java password扩展 JCE))扩展了 JCA API,包含用于加密、密钥交换和信息认证码MAC)的 API

JCE JDK password共同提供了一个与平台无关的完整password APIJCE 作为 JDK 的扩展将独立公布,以符合美国的出口控制约束。

1.2 Eclipse中关联JDK的源代码

         为了更加深刻的理解单向加密算法MD5SHA的在Java中的实现,可使用Eclipse IDE关联JDK的源代码(笔者所用的是JDK6.0)。

JDK6.0安装完毕后在JDK的根文件夹(eg. C:Javajdk1.6.0_21)有src.zip文件夹。可将该文件夹解压到还有一个文件夹(eg. D:amigostudy技术随笔201405)。

src.zip中并不包括全部的JDK源码,比如sun以下的子包都是不存在src.zip中的(eg. 本文使用的sun.security包及其子包就不在当中)。

         要想下载这些子包。须要下载OpenJDK的源码,openjdkjdk的开放原始码版本号,以GPL协议的形式放出。在JDK7的时候。openjdk已经成为jdk7的主干开 发。sun jdk7是在openjdk7的基础上公布的,其大部分原始码都同样,仅仅有少部分原始码被替换掉。

使用JRL(JavaResearch LicenseJava研究授权协议)公布。

         OpenJDK的下载地址:http://download.java.net/openjdk/jdk6/

         完成下载后将解压后的openjdk-6-src-b27-26_oct_2012jdksrcshareclasses文件夹下的全部的文件和文件夹复制到刚才解压的src文件夹下。

         接下来在Eclipse配置关联源代码:点击“Windows-> Preferences”,在左側菜单选择“Java->Installed JREs”,若已经配置本机的JRE,能够不用配置。若未配置,点击右側的“Add”button。在弹出的“Add JRE”窗体选择安装的JDK6.0的路径(eg. C:Javajdk1.6.0_21)。

点击“OK”button完毕JRE的设置。

         选中已设置的JRE,点击右側的“Edit…”button。在弹出窗体中选择rt.jar包后,点击“Source Attachment…”button,在弹出的窗体中点击“External Folder…”button,将源代码路径指向刚才src的路径(eg. D:amigostudy技术随笔201405)。參见下图:
      

         点击“OK”button设置完毕后。在其后编写MD5SHA的实现时。在调用MessageDigest的相关方法的地方,可使用调试模式F5单步调试查看JavaMD5SHA单向加密算法实现主要涉及的类。

1.3 JDKMD5SHA加密的主要类

         JDK6.0中,与MD5SHA密切相关的几个类的类图例如以下:
      
      

         当中“MessageDigestSpi”为顶层抽象类。同一个包下的“MessageDigest”和“DigestBase”为子抽象类。

在上面的类图中,使用了Delegate(托付)设计模式。这样的模式的原理为类B(在此处为Delegage内部类)和类A(在此处为MessageDigestSpi类)是两个互相没有什么关系的类,B具有和A一模一样的方法和属性。而且调用B中的方法和属性就是调用A中同名的方法和属性。B好像就是一个受A授权托付的中介。第三方的代码不须要知道A及其子类的存在,也不须要和A及其子类发生直接的联系,通过B就行直接使用A的功能。这样既可以使用到A的各种功能,又可以非常好的将A及其子类保护起来了。

         MD5SHA的相关代码都在MD5SHA等类中。可是面向客户的MessageDigest抽象类不须要跟各个实现类打交道,仅仅要通过托付类与其打交道就可以。

2MD5加密

2.1 概述

Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

算法的文件号为RFC 1321R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992.

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer ScienceRSA Data Security IncRonald L. Rivest开发出来,经MD2MD3MD4发展而来。

MD5用于确保信息传输完整一致。

是计算机广泛使用的杂凑算法之中的一个(又译摘要算法哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为还有一固定长度值。是杂凑算法的基础原理。MD5的前身有MD2MD3MD4

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个随意长度的字节串变换成一定长的十六进制数字串)。

2.2 算法原理

MD5算法简要的叙述能够为:MD5512位分组来处理输入的信息。且每一分组又被划分为1632位子分组。经过了一系列的处理后。算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

MD5算法中。首先须要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448N为一个非负整数,N能够是零。填充的方法例如以下。在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。

经过这两步的处理。信息的位长=N*512+448+64=(N+1*512。即长度恰好是512的整数倍。

这样做的原因是为满足后面处理中对信息长度的要求。

2.3 Java中的MD5实现

         MD5加密算法的Java实现例如以下所看到的:

package amigo.endecrypt;

import java.security.MessageDigest;

/** 
 * 採用MD5加密
 * 
@author Xingxing,Xie
 * @datetime 2014-5-31 
 
*/

public class MD5Util {
    
/**
     * MD5加密 生成32位md5码
     * 
@param 待加密字符串
     * 
@return 返回32位md5码
     
*/

    
public static String md5Encode(String inStr) throws Exception {
        MessageDigest md5 
= null;
        
try {
            md5 
= MessageDigest.getInstance("MD5");
        }
 catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            
return "";
        }


        
byte[] byteArray = inStr.getBytes("UTF-8");
        
byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue 
= new StringBuffer();
        
for (int i = 0; i < md5Bytes.length; i++{
            
int val = ((int) md5Bytes[i]) & 0xff;
            
if (val < 16{
                hexValue.append(
"0");
            }

            hexValue.append(Integer.toHexString(val));
        }

        
return hexValue.toString();
    }


    
/**
     * 測试主函数
     * 
@param args
     * 
@throws Exception
     
*/

    
public static void main(String args[]) throws Exception {
        String str 
= new String("amigoxiexiexingxing");
        System.out.println(
"原始:" + str);
        System.out.println(
"MD5后:" + md5Encode(str));
    }

}

    測试结果:

原始:amigoxiexiexingxing

MD5后:e9ac094091b96b84cca48098bc21b1d6

 

3SHA加密

3.1 概述

SHA是一种数据加密算法。该算法经过加密专家多年来的发展和改进已日益完好。如今已成为公认的最安全的散列算法之中的一个,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也能够简单的理解为取一串输入码(称为预映射或信息)。并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值能够说是对明文的一种指纹或是摘要所以对散列值的数字签名就能够视为对此明文的数字签名。

         安全散列算法SHASecure Hash AlgorithmSHA)是美国国家标准技术研究所公布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。当中规定了SHA-1SHA-224SHA-256SHA-384。和SHA-512这几种单向散列算法

SHA-1SHA-224SHA-256适用于长度不超过2^64二进制位的消息。SHA-384SHA-512适用于长度不超过2^128二进制位的消息。

3.2 原理

SHA-1是一种数据加密算法。该算法的思想是接收一段明文。然后以一种不可逆的方式将它转换成一段(通常更小)密文。也能够简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。

假设在输入序列中嵌入password,那么不论什么人在不知道password的情况下都不能产生正确的散列值。从而保证了其安全性。

SHA将输入流依照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。

该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。

通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文相应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比較,比較结果一致表示明文未被修改,假设不一致表示明文已被篡改。

MAC (信息认证代码)就是一个散列结果。当中部分输入信息是password,仅仅有知道这个password的參与者才干再次计算和验证MAC码的合法性。

3.3 Java中的SHA实现

         SHA的在Java的实现与MD5类似,參考代码例如以下所看到的:

package amigo.endecrypt;

import java.security.MessageDigest;

/** 
 * 採用SHAA加密
 * 
@author Xingxing,Xie
 * @datetime 2014-6-1 
 
*/

public class SHAUtil {
    
/**
     * SHA加密 生成40位SHA码
     * 
@param 待加密字符串
     * 
@return 返回40位SHA码
     
*/

    
public static String shaEncode(String inStr) throws Exception {
        MessageDigest sha 
= null;
        
try {
            sha 
= MessageDigest.getInstance("SHA");
        }
 catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            
return "";
        }


        
byte[] byteArray = inStr.getBytes("UTF-8");
        
byte[] md5Bytes = sha.digest(byteArray);
        StringBuffer hexValue 
= new StringBuffer();
        
for (int i = 0; i < md5Bytes.length; i++{
            
int val = ((int) md5Bytes[i]) & 0xff;
            
if (val < 16
                hexValue.append(
"0");
            }

            hexValue.append(Integer.toHexString(val));
        }

        
return hexValue.toString();
    }


    
/**
     * 測试主函数
     * 
@param args
     * 
@throws Exception
     
*/

    
public static void main(String args[]) throws Exception {
        String str 
= new String("amigoxiexiexingxing");
        System.out.println(
"原始:" + str);
        System.out.println(
"SHA后:" + shaEncode(str));
    }

}

     測试结果例如以下所看到的:

原始:amigoxiexiexingxing

SHA后:04f79f496dd6bdab3439511606528a4ad9caac5e

3SHA-1MD5的比較

由于二者均由MD4导出,SHA-1MD5彼此非常相似。

对应的,他们的强度和其它特性也是相似,但还有下面几点不同:

1)对强行攻击的安全性:最显著和最重要的差别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生不论什么一个报文使其摘要等于给定报摘要的难度对MD52^128数量级的操作。而对SHA-1则是2^160数量级的操作。

这样,SHA-1对强行攻击有更大的强度。

2)对password分析的安全性:因为MD5的设计,易受password分析的攻击。SHA-1显得不易受这种攻击。

3)速度:在同样的硬件上,SHA-1的执行速度比MD5慢。

4、參考文档

      MD5加密_百度百科》:http://baike.baidu.com/view/1039631.htm?fr=aladdin

      MD5_百度百科》:http://baike.baidu.com/view/7636.htm?fr=aladdin

MD5解密站点》:http://www.cmd5.com/

SHA_百度百科》:

http://baike.baidu.com/link?url=FmqSdqu1CxQXDnQPxCD3hTdepu0RWV6N5dec5ZNWSC_U4WWle4a1h0E6744FnCRI

《加密解密在线測试站点》:http://tripledes.online-domain-tools.com/

Openjdk下载地址:http://download.java.net/openjdk/jdk6/

OpenJDKJDK的差别和联系》:http://blog.csdn.net/kiyoki/article/details/8777744


【平台开发】-Android使用MD5加密算法加密password

标签: 加密平台layoutimportstringandroid
3818人阅读 评论(0) 收藏 举报

非常多的Android软件都须要用户登录登录功能,在开发的时候像这些password都是保存在SharedPreferences中。这些password保存在/data/data/包名/shared_prefs下,保存在一个XML文件里。例如以下:

能够用FileBrower查看

File Explorer

開始说道正题,Android MD5加密算法尽管如今有些人已经将其解开了。可是它的加密机制依旧非常强大,我想绝大对数还是不会解开的。

MD5加密算法是单向加密,仅仅能用你的password才干解开。要不就是会解密算法。否则想都别想解开。为了防止这样的情况的发生。还能够对加密过的password进行再次加密。

以下是个小样例:

main.xml

<?

xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:id="@+id/username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:layout_marginRight="10dp"
android:hint="帐号"/>
<EditText
android:id="@+id/password"
android:password="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:hint="password"/>
<Button
android:id="@+id/save"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:text="保存"/>
<Button
android:id="@+id/login"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:text="登录"/>
</LinearLayout>

login.xml

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="login successful!"/>
</LinearLayout>

login.java

package com.loulijun.md5demo;
 
import android.app.Activity;
import android.os.Bundle;
 
public class Login extendsActivity {
 
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
}
 
}

MD5Demo.java

package com.loulijun.md5demo;
 
import java.security.MessageDigest;
 
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class MD5Demo extendsActivity {
privateEditText username, password;
privateButton savebtn, loginbtn;
String user, pass;
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
savebtn = (Button) findViewById(R.id.save);
loginbtn = (Button) findViewById(R.id.login);
 
savebtn.setOnClickListener(newButton.OnClickListener() {
 
@Override
public void onClick(View v) {
SharedPreferences pre = getSharedPreferences("loginvalue",
MODE_WORLD_WRITEABLE);
pass = MD5(password.getText().toString());
user = username.getText().toString();
if (!pass.equals("") && !user.equals("")) {
pre.edit()
.putString("username",
username.getText().toString())
.putString("password", encryptmd5(pass)).commit();
Toast.makeText(getApplicationContext(),"保存成功!",
Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(getApplicationContext(),"password不能为空!

",

Toast.LENGTH_LONG).show();
}
 
}
 
});
loginbtn.setOnClickListener(newButton.OnClickListener() {
 
@Override
public void onClick(View v) {
SharedPreferences sp = getSharedPreferences("loginvalue",
MODE_WORLD_READABLE);
String loginuser = sp.getString("username",null);
String loginpass = sp.getString("password",null);
 
user = username.getText().toString();
pass = password.getText().toString();
 
String passmd5 = MD5(pass);
String encryptmd5 = encryptmd5(passmd5);
 
System.out.println("username="+ loginuser
+ "-------------password="+ loginpass);
System.out.println("user=="+ user
+ "-------------encryptmd5=="+ encryptmd5);
if (!user.equals("") && !pass.equals("")) {
if (user.equals(loginuser) && encryptmd5.equals(loginpass)) {
Intent intent = new Intent();
intent.setClass(MD5Demo.this, Login.class);
MD5Demo.this.startActivity(intent);
finish();
} else{
Toast.makeText(getApplicationContext(),"password是错误的!

",

Toast.LENGTH_LONG).show();
}
} else{
Toast.makeText(getApplicationContext(),"password不能为空!",
Toast.LENGTH_LONG).show();
}
 
}
 
});
}
 
// MD5加密。32位
public static String MD5(String str) {
MessageDigest md5 =null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch(Exception e) {
e.printStackTrace();
return "";
}
 
char[] charArray = str.toCharArray();
byte[] byteArray =newbyte[charArray.length];
 
for (int i = 0; i < charArray.length; i++) {
byteArray[i] = (byte) charArray[i];
}
byte[] md5Bytes = md5.digest(byteArray);
 
StringBuffer hexValue =newStringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) &0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
returnhexValue.toString();
}
 
// 可逆的加密算法
publicstaticString encryptmd5(String str) {
char[] a = str.toCharArray();
for (int i = 0; i < a.length; i++) {
a[i] = (char) (a[i] ^'l');
}
String s = new String(a);
returns;
}
 
}

加密password程序非常easy。以下是执行的效果:

登录界面

保存

登录成功


原文地址:https://www.cnblogs.com/blfbuaa/p/7279507.html