package utils; import java.math.BigInteger; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * Class used for miscellaneous Hash use
*
* This file is part of the Security Shepherd Project. * *

The Security Shepherd project is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version.
* *

The Security Shepherd project is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details.
* *

You should have received a copy of the GNU General Public License along with the Security * Shepherd project. If not, see . * * @author Mark Denihan */ public class Hash { private static final Logger log = LogManager.getLogger(Hash.class); private static byte[] serverEncryptionKey = randomKeyBytes(); /** * Generates HMAC with servers random encryption key on user name concatenated with level's base * result key in a user friendly HTML form * * @param baseKey The stored result key for the module * @param userSalt Something specific to the user (User name) * @return User Specific Solution in a user friendly HTML form */ public static String generateUserSolution(String baseKey, String userSalt) { log.debug("Generating User Solution..."); String toReturn = "Key Should be here! Please refresh the home page and try again!"; String userSpecificSolution = generateUserSolutionKeyOnly(baseKey, userSalt); if (userSpecificSolution != null) { toReturn = "

" + userSpecificSolution + "

 

"; } return toReturn; } /** * Generates HMAC with servers random encryption key on user name concatenated with level's base * result key * * @param baseKey The stored result key for the module * @param userSalt Something specific to the user (User name) * @return User Specific Solution Key */ public static String generateUserSolutionKeyOnly(String baseKey, String userSalt) { log.debug("Generating User Solution..."); String toReturn = null; try { Mac sha512_HMAC = null; final String HMAC_SHA512 = "HmacSHA512"; sha512_HMAC = Mac.getInstance(HMAC_SHA512); byte[] key = getCurrentKey(); SecretKeySpec keySpec = new SecretKeySpec(key, HMAC_SHA512); sha512_HMAC.init(keySpec); byte[] mac_data = sha512_HMAC.doFinal((baseKey + userSalt).getBytes("UTF-16")); StringBuilder sb = new StringBuilder(); for (byte b : mac_data) { sb.append(String.format("%02X", b)); } String userSpecificSolution = sb.toString(); log.debug("Returning: " + userSpecificSolution); toReturn = userSpecificSolution; } catch (Exception e) { log.error("Encrypt Failure: " + e.toString()); } return toReturn; } public static byte[] getCurrentKey() { return serverEncryptionKey; } public static byte[] randomKeyBytes() { byte byteArray[] = new byte[16]; SecureRandom psn1; try { psn1 = SecureRandom.getInstance("SHA1PRNG"); } catch (NoSuchAlgorithmException e) { log.error("Could not find SHA1PRNG: " + e.toString()); throw new RuntimeException(e); } psn1.setSeed(psn1.nextLong()); psn1.nextBytes(byteArray); return byteArray; } /** * Creates a psedorandom string * * @return Random String */ public static String randomString() { String result = new String(); byte byteArray[] = new byte[16]; SecureRandom psn1 = null; try { psn1 = SecureRandom.getInstance("SHA1PRNG"); } catch (NoSuchAlgorithmException e) { log.error("Could not find SHA1PRNG: " + e.toString()); throw new RuntimeException(e); } psn1.setSeed(psn1.nextLong()); psn1.nextBytes(byteArray); BigInteger bigInt = new BigInteger(byteArray); result = bigInt.toString(); log.debug("Generated String = " + result); return result; } }