//[[restapi:start|RESTful API]]// ====== Ciphering Data ====== Sometimes using this REST API we find ourselves in situations where we need to use some kind of encryption in order to //pass through some text// parameters that could contain special characters and may cause data loss or maybe to //obfuscate text// to make it more secure To avoid this kind of situations we use use Base64 or SHA256. All classes used here are present in [[http://www.oracle.com/technetwork/java/javase/downloads/index.html|Java 1.8]]. //No additional libraries are required// ===== Base64 - Encode ===== We can easily transform a text block into a Base64 String in java by doing new String(Base64.getUrlEncoder().encode(data), StandardCharsets.UTF_8); ===== Base64 - Decode ===== Also, we can decode a Base64 String into regular text by doing: new String(Base64.getUrlDecoder().decode(data.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); ===== SHA256 - Cipher ===== In java it's pretty easy to cipher using SHA256, the following method uses no libraries to achieve that goal private static String signHmacSHA256(String message, byte[] key) { try { SecretKey signingKey = new SecretKeySpec(key, "HMACSHA256"); Mac mac = Mac.getInstance("HMACSHA256"); mac.init(signingKey); byte[] digest = mac.doFinal(message.getBytes("UTF-8")); char[] hexadecimals = new char[digest.length * 2]; for (int i = 0; i < digest.length; ++i) { for (int j = 0; j < 2; ++j) { int value = (digest[i] >> (4 - 4 * j)) & 0xf; char base = (value < 10) ? ('0') : ('a' - 10); hexadecimals[i * 2 + j] = (char) (base + value); } } return new String(hexadecimals); } catch (Exception e) { e.printStackTrace(); return message; } } ===== HmacSHA512 - Cipher ===== In java it's possible to cipher using HmacSHA512, the following method uses the following libraries to achieve that goal import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; An example private String sign(String algorithm, String input, byte[] key) throws Exception { Mac mac = Mac.getInstance(algorithm); mac.init(new SecretKeySpec(key, algorithm)); return DatatypeConverter.printHexBinary(mac.doFinal(input.getBytes("UTF-8"))).toLowerCase(); }