
Простые алгоритмы шифрования Java включают:
- BASE64, строго говоря, является форматом кодирования, а не алгоритмом шифрования
- MD5 (Message Digest Algorithm 5, алгоритм дайджеста информации)
- SHA (Secure Hash Algorithm, алгоритм безопасного хеширования)
- HMAC (Hash Message Authentication Code, код аутентификации сообщений на основе хеша)
1. BASE64
Base64 — один из наиболее распространённых методов кодирования, используемых в сети для передачи 8-битного байтового кода. Можно обратиться к RFC2045~RFC2049, которые содержат подробные спецификации MIME. Кодирование Base64 может использоваться для передачи более длинной идентификационной информации в среде HTTP. Например, в системе Java Persistence Hibernate Base64 используется для кодирования более длинного уникального идентификатора (обычно 128-битного UUID) в строку, используемую как параметр в HTTP-формах и HTTP GET URL. В других приложениях также часто необходимо кодировать двоичные данные в форму, подходящую для размещения в URL (включая скрытые поля форм). В этом случае кодирование Base64 нечитаемо, то есть закодированные данные невозможно напрямую увидеть невооружённым глазом. (Источник: Baidu Baike)
Код реализации на Java:
package com.cn.单向加密;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/*
BASE64的加密解密是双向的,可以求反解.
BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。
JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,
一般来说是不推荐使用的。
BASE64 严格地说,属于编码格式,而非加密算法
主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。
另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。
BASE64
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
*/
public class BASE64 {
/**
* BASE64解密
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* BASE64加密
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
public static void main(String[] args) {
String str="12345678";
try {
String result1= BASE64.encryptBASE64(str.getBytes());
System.out.println("result1=====加密数据=========="+result1);
byte result2[]= BASE64.decryptBASE64(result1);
String str2=new String(result2);
System.out.println("str2========解密数据========"+str2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. MD5
MD5То есть Message-Digest Algorithm 5 (алгоритм дайджеста сообщений 5), используемый для обеспечения полной и согласованной передачи информации. Это один из широко используемых хеш-алгоритмов в компьютерах (также переводится как алгоритм дайджеста, хеш-алгоритм), и в основных языках программирования обычно уже есть реализации MD5. Вычисление данных (например, китайских символов) в другое значение фиксированной длины — основной принцип хеш-алгоритмов. Предшественниками MD5 являются MD2, MD3и MD4. Он широко используется в технологиях шифрования и дешифрования, часто для проверки файлов. Проверка? Независимо от того, насколько большой файл, после хеширования MD5 можно получить уникальное значение MD5. Например, проверка ISO сейчас целиком основана на MD5. Как это используется? Конечно, ISO обрабатывается с помощью MD5 для получения значения MD5. Пользователи, которые скачивают ISO-файлы Linux, обычно видели строку MD5 рядом со ссылкой для скачивания. Она используется для проверки того, согласован ли файл.
Код реализации на Java:
package com.cn.单向加密;
import java.math.BigInteger;
import java.security.MessageDigest;
/*
MD5(Message Digest algorithm 5,信息摘要算法)
通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串
Digest:汇编
*/
public class MD5 {
public static final String KEY_MD5 = "MD5";
public static String getResult(String inputStr)
{
System.out.println("=======加密前的数据:"+inputStr);
BigInteger bigInteger=null;
try {
MessageDigest md = MessageDigest.getInstance(KEY_MD5);
byte[] inputData = inputStr.getBytes();
md.update(inputData);
bigInteger = new BigInteger(md.digest());
} catch (Exception e) {e.printStackTrace();}
System.out.println("MD5加密后:" + bigInteger.toString(16));
return bigInteger.toString(16);
}
public static void main(String args[])
{
try {
String inputStr = "简单加密8888888888888888888";
getResult(inputStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Алгоритм MD5 имеет следующие характеристики:
1. Сжимаемость: для данных любой длины длина вычисленного значения MD5 фиксирована.
2. Простота вычисления: значение MD5 легко вычислить по исходным данным.
3. Устойчивость к модификации: любое изменение исходных данных, даже изменение только 1 байта, приведёт к сильно отличающемуся значению MD5.
4. Слабая устойчивость к коллизиям: имея исходные данные и их значение MD5, очень трудно найти данные (то есть поддельные данные) с таким же значением MD5.
5. Сильная устойчивость к коллизиям: очень трудно найти два разных фрагмента данных, имеющих одинаковое значение MD5.
Функция MD5 заключается в том, чтобы "сжать" большой объем информации в секретный формат перед подписанием закрытого ключа с помощью программного обеспечения цифровой подписи (то есть преобразовать байтовую строку произвольной длины в шестнадцатеричную строку цифр фиксированной длины). Помимо MD5, к другим известным относятся sha-1, RIPEMD и Haval и т. д.
3.SHA
Алгоритм безопасного хеширования (SHA) в основном применим к алгоритму цифровой подписи (Digital Signature Algorithm, DSA), определенному в стандарте цифровой подписи (DSS). Для сообщений длиной менее 2^64 бит SHA1 создает 160-битный дайджест сообщения. После многих лет развития и совершенствования экспертами по шифрованию этот алгоритм стал все более совершенным и широко используется. Идея алгоритма состоит в том, чтобы получить фрагмент открытого текста и затем необратимым образом преобразовать его во фрагмент (обычно меньшего размера) шифротекста. Его также можно просто понять как процесс взятия строки входных кодов (называемых предварительным отображением или информацией) и преобразования их в более короткую выходную последовательность фиксированной битовой длины, то есть хеш-значение (также называемое дайджестом информации или кодом аутентификации сообщения). Значение хеш-функции можно назвать "отпечатком" или "дайджестом" открытого текста, поэтому цифровую подпись значения хеша можно рассматривать как цифровую подпись этого открытого текста.
Код реализации на Java:
package com.cn.单向加密;
import java.math.BigInteger;
import java.security.MessageDigest;
/*
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,
被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了,
但是SHA仍然是公认的安全加密算法,较之MD5更为安全*/
public class SHA {
public static final String KEY_SHA = "SHA";
public static String getResult(String inputStr)
{
BigInteger sha =null;
System.out.println("=======加密前的数据:"+inputStr);
byte[] inputData = inputStr.getBytes();
try {
MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA);
messageDigest.update(inputData);
sha = new BigInteger(messageDigest.digest());
System.out.println("SHA加密后:" + sha.toString(32));
} catch (Exception e) {e.printStackTrace();}
return sha.toString(32);
}
public static void main(String args[])
{
try {
String inputStr = "简单加密";
getResult(inputStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Сравнение SHA-1 и MD5
Поскольку оба они являются производными от MD4, SHA-1 и MD5 очень похожи друг на друга. Соответственно, их стойкость и другие характеристики также схожи, но есть следующие различия:
l Защита от атак методом перебора: наиболее существенное и важное различие состоит в том, что дайджест SHA-1 на 32 бита длиннее дайджеста MD5. При использовании методов перебора сложность создания любого сообщения, дайджест которого совпадает с заданным дайджестом сообщения, имеет порядок 2^128 операций для MD5 и порядок 2^160 операций для SHA-1. Таким образом, SHA-1 обладает большей стойкостью к атакам методом перебора.
l Защита от криптоанализа: из-за дизайна MD5 он уязвим к атакам криптоанализа; SHA-1, по-видимому, менее подвержен таким атакам.
l Скорость: на одном и том же оборудовании SHA-1 работает медленнее, чем MD5.
4.HMAC
HMAC (Hash Message Authentication Code, код аутентификации сообщения на основе хэша) — это протокол аутентификации, основанный на хэш-алгоритме с ключом. Принцип реализации кода аутентификации сообщения состоит в использовании открытой функции и ключа для генерации значения фиксированной длины в качестве идентификатора аутентификации и использовании этого идентификатора для проверки целостности сообщения. Ключ используется для генерации небольшого блока данных фиксированного размера, а именно MAC, который добавляется к сообщению и затем передается. Получатель использует ключ, общий с отправителем, для идентификации и аутентификации и т. д.
Код реализации на Java:
package com.cn.单向加密;
/*
HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块,
即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。*/
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import com.cn.comm.Tools;
/**
* 基础加密组件
*/
public abstract class HMAC {
public static final String KEY_MAC = "HmacMD5";
/**
* 初始化HMAC密钥
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
SecretKey secretKey = keyGenerator.generateKey();
return BASE64.encryptBASE64(secretKey.getEncoded());
}
/**
* HMAC加密 :主要方法
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static String encryptHMAC(byte[] data, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(BASE64.decryptBASE64(key), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return new String(mac.doFinal(data));
}
public static String getResult1(String inputStr)
{
String path=Tools.getClassPath();
String fileSource=path+"/file/HMAC_key.txt";
System.out.println("=======加密前的数据:"+inputStr);
String result=null;
try {
byte[] inputData = inputStr.getBytes();
String key = HMAC.initMacKey(); /*产生密钥*/
System.out.println("Mac密钥:===" + key);
/*将密钥写文件*/
Tools.WriteMyFile(fileSource,key);
result= HMAC.encryptHMAC(inputData, key);
System.out.println("HMAC加密后:===" + result);
} catch (Exception e) {e.printStackTrace();}
return result.toString();
}
public static String getResult2(String inputStr)
{
System.out.println("=======加密前的数据:"+inputStr);
String path=Tools.getClassPath();
String fileSource=path+"/file/HMAC_key.txt";
String key=null;;
try {
/*将密钥从文件中读取*/
key=Tools.ReadMyFile(fileSource);
System.out.println("getResult2密钥:===" + key);
} catch (Exception e1) {
e1.printStackTrace();}
String result=null;
try {
byte[] inputData = inputStr.getBytes();
/*对数据进行加密*/
result= HMAC.encryptHMAC(inputData, key);
System.out.println("HMAC加密后:===" + result);
} catch (Exception e) {e.printStackTrace();}
return result.toString();
}
public static void main(String args[])
{
try {
String inputStr = "简单加密";
/*使用同一密钥:对数据进行加密:查看两次加密的结果是否一样*/
getResult1(inputStr);
getResult2(inputStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Источник: http://www.cnblogs.com/oumyye/p/4593592.html