Java SSHA 匹配算法

package org.andrew.encrypt;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

public class EncryptUtil {

	public static void main(String[] args) throws IOException {
		
		EncryptUtil util = new EncryptUtil();
		BASE64Decoder decoder = new BASE64Decoder();
		
		//String originalDigest = "e1NTSEF9NGs5VTVCRkhtbXMwVUVFd3AxT3M0KysrYURQQjJaWVlLMzFHREE9PQ==";
		//String originalDigest = "e1NTSEF9MGxCdWRIMW5oS1gzVTlOTmVrWlJXN0RENTJSZlNhemtheUx6bUE9PQ==";
		String originalDigest = "e1NTSEF9eG4vYzF4TDljRU1lVGkrYVRJcUkwWDJmdEoxbm90RnBwd0NrN0E9PQ==";
		String password = "123456";
		
		byte[] sshaDigestByte = decoder.decodeBuffer(originalDigest);
		String digest = new String(sshaDigestByte);
		
		System.out.println(digest);
		boolean isSame = util.verifyPassword(digest, password);
		
		System.out.println(isSame);
	}

	/**
	 * Splits a byte array into two.
	 * 
	 * @param src
	 *            byte array to split
	 * @param n
	 *            location to split the array
	 * @return a two dimensional array of the split
	 */
	private static byte[][] split(byte[] src, int n) {
		byte[] l;
		byte[] r;

		if (src.length <= n) {
			l = src;
			r = new byte[0];

		} else {
			l = new byte[n];
			r = new byte[src.length - n];
			System.arraycopy(src, 0, l, 0, n);
			System.arraycopy(src, n, r, 0, r.length);
		}

		byte[][] lr = { l, r };

		return lr;

	}

	/**
	 * Validates if a plaintext password matches a hashed version.
	 * 
	 * @param digest
	 *            digested version
	 * @param password
	 *            plaintext password
	 * @return if the two match
	 */
	public static boolean verifyPassword(String digest, String password) {
		String alg = null;
		int size = 0;

		if (digest.regionMatches(true, 0, "{SHA}", 0, 5)) {
			digest = digest.substring(5);
			alg = "SHA1";
			size = 20;

		} else if (digest.regionMatches(true, 0, "{SSHA}", 0, 6)) {
			digest = digest.substring(6);
			alg = "SHA1";
			size = 20;

		} else if (digest.regionMatches(true, 0, "{MD5}", 0, 5)) {
			digest = digest.substring(5);
			alg = "MD5";
			size = 16;

		} else if (digest.regionMatches(true, 0, "{SMD5}", 0, 6)) {
			digest = digest.substring(6);
			alg = "MD5";
			size = 16;

		}

		try {
			MessageDigest mDigest = MessageDigest.getInstance(alg);

			if (mDigest == null) {
				return false;
			}

			BASE64Encoder enc = new BASE64Encoder();
			BASE64Decoder decoder = new BASE64Decoder();
			
			byte[] decodeBase64 = decoder.decodeBuffer(digest);
			byte[][] hs =split(decodeBase64, size);
			byte[] hash = hs[0];
			byte[] salt = hs[1];
			mDigest.reset();
			mDigest.update(password.getBytes());
			mDigest.update(salt);

			byte[] pwhash = mDigest.digest();

			return MessageDigest.isEqual(hash, pwhash);

		} catch (NoSuchAlgorithmException nsae) {
			return false;
		} catch (IOException e) {
			e.printStackTrace();
		}

		return false;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值