毕业设计要做一个论文在线管理系统,所以加密这块儿呢,必不可少的,首选还是md5,md5一次加密现在也都有库可查了,所以打算采用二次加密,昨天找了下资料,发现java有专门的类可以来实现,奶牛不是搞算法那块儿料,所以算法实现的就不要看了。下面来分析下。
java.security
Class MessageDigest
java.lang.Object
java.security.MessageDigestSpi
java.security.MessageDigest
具体使用到的方法有两个:
- 方法:getInstance(String algorithm)
- 描述:Returns a MessageDigest object that implements the specified digest algorithm.
- algorithm的可以使用值有:DSA, SHA-1, MD5, DES, and DES3
- 详情可以看:
- http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#ProviderImplReq
- 返回值: static MessageDigest
-
- 方法:digest(byte[] input)
- 描述:Performs a final update on the digest using the specified array of bytes
- then completes the digest computation.
- 返回值: byte[]
首先用getInstance("md5")方法来选择md5加密,然后用digest(byte[] input)来得到加密后的128位密文byte数组,而我们平时看到的md5密文是32位或者是16位的,因此需要转换。直接用digest(byte[] input)就可以免去使用update(byte[] input) 的那步了。
digest(byte[] input)返回的是16组8位二进制数,需要转换为2位十六进制数,然后依次转换可以得到32位的md5密文,截取32位密文的8~24位即为16位md5密文。
具体实现代码:
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
-
- public class md5 {
- public String str;
-
- public void md5create(String input) {
- try {
- MessageDigest md = MessageDigest.getInstance("MD5");
- byte b[] = md.digest(input.getBytes());
-
- int i;
-
- StringBuffer buf = new StringBuffer("");
- for (int offset = 0; offset < b.length; offset++) {
- i = b[offset];
- if (i < 0)
- i += 256;
- if (i < 16)
- buf.append("0");
- buf.append(Integer.toHexString(i));
-
- }
- str = buf.toString();
- System.out.println("32bit result: " + buf.toString());
- System.out.println("16bit result: "
- + buf.toString().substring(8, 24));
- } catch (NoSuchAlgorithmException e) {
-
- e.printStackTrace();
-
- }
- }
-
- public static void main(String agrs[]) {
- md5 md5object = new md5();
- md5object.md5create("nenew");
- }
-
- }