$.Digests.java Source code

Java tutorial

Introduction

Here is the source code for $.Digests.java

Source

    #set($symbol_pound='#')#set($symbol_dollar='$')#set($symbol_escape='\')
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package ${package}.biz.util;

    import org.apache.commons.lang3.Validate;

    import java.io.IOException;
    import java.io.InputStream;
    import java.security.GeneralSecurityException;
    import java.security.MessageDigest;
    import java.security.SecureRandom;

    /**
     * ?SHA-1/MD5??.
     * <p>
     * ByteSource??Hex, Base64UrlSafeBase64
     *
     * @author calvin
     */
    public class Digests {

        private static final String SHA1 = "SHA-1";
        private static final String MD5 = "MD5";

        private static SecureRandom random = new SecureRandom();

        /**
         * sha1.
         */
        public static byte[] sha1(byte[] input) {
            return digest(input, SHA1, null, 1);
        }

        public static byte[] sha1(byte[] input, byte[] salt) {
            return digest(input, SHA1, salt, 1);
        }

        public static byte[] sha1(byte[] input, byte[] salt, int iterations) {
            return digest(input, SHA1, salt, iterations);
        }

        /**
         * , ?md5sha1.
         */
        private static byte[] digest(byte[] input, String algorithm, byte[] salt, int iterations) {
            try {
                MessageDigest digest = MessageDigest.getInstance(algorithm);

                if (salt != null) {
                    digest.update(salt);
                }

                byte[] result = digest.digest(input);

                for (int i = 1; i < iterations; i++) {
                    digest.reset();
                    result = digest.digest(result);
                }
                return result;
            } catch (GeneralSecurityException e) {
                throw Exceptions.unchecked(e);
            }
        }

        /**
         * ??Byte[]salt.
         *
         * @param numBytes byte?
         */
        public static byte[] generateSalt(int numBytes) {
            Validate.isTrue(numBytes > 0, "numBytes argument must be a positive integer (1 or larger)", numBytes);

            byte[] bytes = new byte[numBytes];
            random.nextBytes(bytes);
            return bytes;
        }

        /**
         * md5.
         */
        public static byte[] md5(InputStream input) throws IOException {
            return digest(input, MD5);
        }

        /**
         * sha1.
         */
        public static byte[] sha1(InputStream input) throws IOException {
            return digest(input, SHA1);
        }

        private static byte[] digest(InputStream input, String algorithm) throws IOException {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
                int bufferLength = 8 * 1024;
                byte[] buffer = new byte[bufferLength];
                int read = input.read(buffer, 0, bufferLength);

                while (read > -1) {
                    messageDigest.update(buffer, 0, read);
                    read = input.read(buffer, 0, bufferLength);
                }

                return messageDigest.digest();
            } catch (GeneralSecurityException e) {
                throw Exceptions.unchecked(e);
            }
        }

    }