🎯 Exemplos recomendados
Balanced sample collections from various categories for you to explore
Exemplos de Criptografia Android Java
Exemplos de criptografia Android Java incluindo cálculo de hash, criptografia AES e codificação Base64
💻 Codificação Base64 java
🟢 simple
⭐⭐
Codificar e decodificar dados usando Base64 com várias opções e conjuntos de caracteres
⏱️ 20 min
🏷️ java, android, base64, encoding
Prerequisites:
Basic Java
// Android Java Base64 Encoding Examples
// Using java.util.Base64 (Android API 26+) and android.util.Base64
import java.util.Base64;
import android.util.Base64 as AndroidBase64;
import java.nio.charset.StandardCharsets;
import java.io.*;
// 1. Basic Base64 Encoding/Decoding
class BasicBase64 {
// Encode string to Base64
public String encodeToString(String input) {
byte[] encodedBytes = Base64.getEncoder().encode(input.getBytes());
return new String(encodedBytes);
}
// Decode Base64 to string
public String decodeString(String encoded) {
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
return new String(decodedBytes);
}
// Encode bytes to Base64
public String encodeBytes(byte[] bytes) {
return Base64.getEncoder().encodeToString(bytes);
}
// Decode Base64 to bytes
public byte[] decodeToBytes(String encoded) {
return Base64.getDecoder().decode(encoded);
}
// Encode with URL-safe mode
public String encodeUrlSafe(String input) {
return Base64.getUrlEncoder().encodeToString(input.getBytes());
}
// Decode URL-safe Base64
public String decodeUrlSafe(String encoded) {
byte[] decodedBytes = Base64.getUrlDecoder().decode(encoded);
return new String(decodedBytes);
}
}
// 2. Android Base64 (Compat for older API levels)
class AndroidBase64Codec {
// Encode using Android Base64
public String encode(String input, int flags) {
byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
byte[] encoded = AndroidBase64.encode(inputBytes, flags);
return new String(encoded);
}
public String encode(String input) {
return encode(input, AndroidBase64.NO_WRAP);
}
// Decode using Android Base64
public String decode(String encoded, int flags) {
byte[] decoded = AndroidBase64.decode(encoded, flags);
return new String(decoded, StandardCharsets.UTF_8);
}
public String decode(String encoded) {
return decode(encoded, AndroidBase64.NO_WRAP);
}
// Encode with NO_WRAP (no padding)
public String encodeNoWrap(String input) {
return encode(input, AndroidBase64.NO_WRAP);
}
// Encode with CRLF (line breaks)
public String encodeWithCRLF(String input) {
return encode(input, AndroidBase64.CRLF);
}
}
// 3. Base64 for Binary Data
class BinaryBase64 {
// Encode image to Base64
public String encodeImage(byte[] imageBytes) {
return Base64.getEncoder().encodeToString(imageBytes);
}
// Decode Base64 to image bytes
public byte[] decodeToImage(String encoded) {
return Base64.getDecoder().decode(encoded);
}
// Encode file to Base64
public String encodeFile(File file) throws IOException {
byte[] bytes = readBytesFromFile(file);
return Base64.getEncoder().encodeToString(bytes);
}
// Decode Base64 and save to file
public boolean decodeToFile(String encoded, File file) {
try {
byte[] bytes = Base64.getDecoder().decode(encoded);
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytes);
fos.close();
return true;
} catch (Exception e) {
System.out.println("Error decoding to file: " + e.getMessage());
return false;
}
}
// Encode with MIME encoding (76 chars per line)
public String encodeMime(String input) {
return Base64.getMimeEncoder().encodeToString(input.getBytes());
}
// Decode MIME encoding
public String decodeMime(String encoded) {
byte[] decodedBytes = Base64.getMimeDecoder().decode(encoded);
return new String(decodedBytes);
}
private byte[] readBytesFromFile(File file) throws IOException {
FileInputStream fis = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
fis.read(bytes);
fis.close();
return bytes;
}
}
// 4. Base64 Streams
class Base64Streams {
// Encode large file with streaming
public boolean encodeLargeFile(File inputFile, File outputFile) {
try {
FileInputStream inputStream = new FileInputStream(inputFile);
FileOutputStream outputStream = new FileOutputStream(outputFile);
java.io.OutputStream encoder = Base64.getEncoder().wrap(outputStream);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
encoder.write(buffer, 0, bytesRead);
}
encoder.close();
inputStream.close();
return true;
} catch (Exception e) {
System.out.println("Error encoding large file: " + e.getMessage());
return false;
}
}
// Decode large file with streaming
public boolean decodeLargeFile(File inputFile, File outputFile) {
try {
FileInputStream inputStream = new FileInputStream(inputFile);
FileOutputStream outputStream = new FileOutputStream(outputFile);
java.io.InputStream decoder = Base64.getDecoder().wrap(inputStream);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = decoder.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
decoder.close();
outputStream.close();
return true;
} catch (Exception e) {
System.out.println("Error decoding large file: " + e.getMessage());
return false;
}
}
}
// 5. Base64 Validation and Utilities
class Base64Utilities {
// Validate Base64 string
public boolean isValidBase64(String input) {
try {
Base64.getDecoder().decode(input);
return true;
} catch (IllegalArgumentException e) {
return false;
}
}
// Check if URL-safe Base64
public boolean isValidUrlSafeBase64(String input) {
try {
Base64.getUrlDecoder().decode(input);
return true;
} catch (IllegalArgumentException e) {
return false;
}
}
// Remove padding from Base64
public String removePadding(String encoded) {
return encoded.replaceAll("=+$", "");
}
// Add padding to Base64
public String addPadding(String encoded) {
int paddingLength = (4 - (encoded.length() % 4)) % 4;
StringBuilder sb = new StringBuilder(encoded);
for (int i = 0; i < paddingLength; i++) {
sb.append('=');
}
return sb.toString();
}
// Convert standard Base64 to URL-safe
public String toUrlSafe(String encoded) {
return encoded
.replace("+", "-")
.replace("/", "_")
.replaceAll("=+$", "");
}
// Convert URL-safe to standard Base64
public String fromUrlSafe(String encoded) {
String result = encoded
.replace("-", "+")
.replace("_", "/");
// Add padding
int paddingLength = (4 - (result.length() % 4)) % 4;
StringBuilder sb = new StringBuilder(result);
for (int i = 0; i < paddingLength; i++) {
sb.append('=');
}
return sb.toString();
}
}
// 6. Base64 for Data URLs
class DataUrlBase64 {
// Create data URL for image
public String createImageDataUrl(byte[] imageBytes, String mimeType) {
String base64 = Base64.getEncoder().encodeToString(imageBytes);
return "data:" + mimeType + ";base64," + base64;
}
public String createImageDataUrl(byte[] imageBytes) {
return createImageDataUrl(imageBytes, "image/png");
}
// Create data URL for text
public String createTextDataUrl(String text, String mimeType) {
String base64 = Base64.getEncoder().encodeToString(text.getBytes());
return "data:" + mimeType + ";base64," + base64;
}
public String createTextDataUrl(String text) {
return createTextDataUrl(text, "text/plain");
}
// Extract Base64 from data URL
public String extractFromDataUrl(String dataUrl) {
String prefix = "base64,";
int index = dataUrl.indexOf(prefix);
if (index != -1) {
return dataUrl.substring(index + prefix.length());
}
return null;
}
// Parse data URL
public DataUrlPair parseDataUrl(String dataUrl) {
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("data:([^;]+);base64,(.+)");
java.util.regex.Matcher matcher = pattern.matcher(dataUrl);
if (matcher.find()) {
String mimeType = matcher.group(1);
String base64 = matcher.group(2);
return new DataUrlPair(mimeType, base64);
}
return null;
}
static class DataUrlPair {
public String mimeType;
public String base64;
public DataUrlPair(String mimeType, String base64) {
this.mimeType = mimeType;
this.base64 = base64;
}
}
}
// 7. Base64 Hash and Checksum
class Base64Hash {
// Encode MD5 hash as Base64
public String md5Base64(String input) throws Exception {
java.security.MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
byte[] hash = digest.digest(input.getBytes());
return Base64.getEncoder().encodeToString(hash);
}
// Encode SHA-256 hash as Base64
public String sha256Base64(String input) throws Exception {
java.security.MessageDigest digest = java.security.MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes());
return Base64.getEncoder().encodeToString(hash);
}
// Create Basic Authentication header
public String createBasicAuth(String username, String password) {
String credentials = username + ":" + password;
String encoded = Base64.getEncoder().encodeToString(credentials.getBytes());
return "Basic " + encoded;
}
// Parse Basic Authentication
public BasicAuthPair parseBasicAuth(String header) {
if (!header.startsWith("Basic ")) {
return null;
}
String encoded = header.substring(6);
String decoded = new String(Base64.getDecoder().decode(encoded));
String[] parts = decoded.split(":", 2);
if (parts.length == 2) {
return new BasicAuthPair(parts[0], parts[1]);
}
return null;
}
static class BasicAuthPair {
public String username;
public String password;
public BasicAuthPair(String username, String password) {
this.username = username;
this.password = password;
}
}
}
// Main demonstration
public class Base64EncodingDemo {
public static void demonstrateBase64Encoding() throws Exception {
System.out.println("=== Android Java Base64 Encoding Examples ===\n");
// 1. Basic encoding/decoding
System.out.println("--- 1. Basic Encoding/Decoding ---");
BasicBase64 basicBase64 = new BasicBase64();
String text = "Hello, World!";
String encoded = basicBase64.encodeToString(text);
System.out.println("Original: " + text);
System.out.println("Encoded: " + encoded);
String decoded = basicBase64.decodeString(encoded);
System.out.println("Decoded: " + decoded);
// 2. URL-safe encoding
System.out.println("\n--- 2. URL-Safe Encoding ---");
String urlText = "Hello, World! This is a test.";
String urlEncoded = basicBase64.encodeUrlSafe(urlText);
System.out.println("URL-safe encoded: " + urlEncoded);
String urlDecoded = basicBase64.decodeUrlSafe(urlEncoded);
System.out.println("URL-safe decoded: " + urlDecoded);
// 3. Binary data
System.out.println("\n--- 3. Binary Data ---");
BinaryBase64 binaryBase64 = new BinaryBase64();
byte[] imageData = new byte[]{(byte) 0x89, (byte) 0x50, (byte) 0x4E,
(byte) 0x47, (byte) 0x0D, (byte) 0x0A}; // PNG header
String imageEncoded = binaryBase64.encodeImage(imageData);
System.out.println("Image data encoded: " + imageEncoded);
byte[] imageDecoded = binaryBase64.decodeToImage(imageEncoded);
StringBuilder hex = new StringBuilder();
for (byte b : imageDecoded) {
hex.append(String.format("0x%02X ", b));
}
System.out.println("Image data decoded: " + hex.toString().trim());
// 4. MIME encoding
System.out.println("\n--- 4. MIME Encoding ---");
String longText = "This is a very long text that will be split into " +
"multiple lines when using MIME encoding.";
String mimeEncoded = binaryBase64.encodeMime(longText);
System.out.println("MIME encoded:");
System.out.println(mimeEncoded);
// 5. Utilities
System.out.println("\n--- 5. Utilities ---");
Base64Utilities utilities = new Base64Utilities();
System.out.println("Is valid Base64: " + utilities.isValidBase64(encoded));
System.out.println("Is valid URL-safe: " + utilities.isValidUrlSafeBase64(urlEncoded));
String withPadding = "SGVsbG8=";
System.out.println("\nRemove padding: " + utilities.removePadding(withPadding));
System.out.println("Add padding: " + utilities.addPadding(utilities.removePadding(withPadding)));
String standardBase64 = "SGVsbG8rV29ybGQvVGVzdA==";
String urlSafe = utilities.toUrlSafe(standardBase64);
System.out.println("\nTo URL-safe: " + urlSafe);
System.out.println("From URL-safe: " + utilities.fromUrlSafe(urlSafe));
// 6. Data URLs
System.out.println("\n--- 6. Data URLs ---");
DataUrlBase64 dataUrl = new DataUrlBase64();
byte[] textBytes = "Sample text".getBytes();
String textDataUrl = dataUrl.createTextDataUrl(new String(textBytes), "text/plain");
System.out.println("Text data URL: " + textDataUrl);
String extracted = dataUrl.extractFromDataUrl(textDataUrl);
System.out.println("Extracted Base64: " + extracted);
// 7. Hash and authentication
System.out.println("\n--- 7. Hash and Authentication ---");
Base64Hash base64Hash = new Base64Hash();
String md5Base64 = base64Hash.md5Base64(text);
System.out.println("MD5 Base64: " + md5Base64);
String sha256Base64 = base64Hash.sha256Base64(text);
System.out.println("SHA-256 Base64: " + sha256Base64);
String basicAuth = base64Hash.createBasicAuth("alice", "password123");
System.out.println("\nBasic Auth: " + basicAuth);
Base64Hash.BasicAuthPair parsedAuth = base64Hash.parseBasicAuth(basicAuth);
System.out.println("Parsed Auth: " + parsedAuth.username + " / " + parsedAuth.password);
System.out.println("\n=== All Base64 Encoding Examples Completed ===");
}
}
💻 Cálculo de Hash java
🟡 intermediate
⭐⭐⭐⭐
Calcular hashes MD5, SHA-1, SHA-256 e SHA-512 para strings e arquivos
⏱️ 30 min
🏷️ java, android, cryptography, hash
Prerequisites:
Intermediate Java, Cryptography basics
// Android Java Hash Calculation Examples
// Using java.security package
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.SecureRandom;
// 1. String Hashing
class StringHasher {
// Calculate MD5 hash
public String md5(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] hash = digest.digest(input.getBytes());
return bytesToHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 not available", e);
}
}
// Calculate SHA-1 hash
public String sha1(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] hash = digest.digest(input.getBytes());
return bytesToHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("SHA-1 not available", e);
}
}
// Calculate SHA-256 hash
public String sha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes());
return bytesToHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("SHA-256 not available", e);
}
}
// Calculate SHA-512 hash
public String sha512(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
byte[] hash = digest.digest(input.getBytes());
return bytesToHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("SHA-512 not available", e);
}
}
// Calculate with salt
public String hashWithSalt(String input, String salt, String algorithm) {
try {
MessageDigest digest = MessageDigest.getInstance(algorithm);
digest.update(salt.getBytes());
byte[] hash = digest.digest(input.getBytes());
return bytesToHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(algorithm + " not available", e);
}
}
public String hashWithSalt(String input, String salt) {
return hashWithSalt(input, salt, "SHA-256");
}
// Helper: Convert bytes to hex string
private String bytesToHex(byte[] bytes) {
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
// Helper: Convert bytes to hex string (alternative)
private String bytesToHexAlternative(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02x", b));
}
return result.toString();
}
}
// 2. File Hashing
class FileHasher {
// Calculate hash for file
public String hashFile(File file, String algorithm) throws IOException {
try {
MessageDigest digest = MessageDigest.getInstance(algorithm);
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
digest.update(buffer, 0, bytesRead);
}
fis.close();
byte[] hash = digest.digest();
return bytesToHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(algorithm + " not available", e);
}
}
public String hashFile(File file) throws IOException {
return hashFile(file, "SHA-256");
}
// Calculate MD5 of file
public String md5File(File file) throws IOException {
return hashFile(file, "MD5");
}
// Calculate SHA-256 of file
public String sha256File(File file) throws IOException {
return hashFile(file, "SHA-256");
}
// Calculate hash for large file with progress
public interface HashProgressListener {
void onProgress(long bytesProcessed, long totalBytes);
}
public String hashFileWithProgress(
File file,
String algorithm,
HashProgressListener listener
) throws IOException {
try {
MessageDigest digest = MessageDigest.getInstance(algorithm);
long fileSize = file.length();
long bytesProcessed = 0L;
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
digest.update(buffer, 0, bytesRead);
bytesProcessed += bytesRead;
if (listener != null) {
listener.onProgress(bytesProcessed, fileSize);
}
}
fis.close();
byte[] hash = digest.digest();
return bytesToHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(algorithm + " not available", e);
}
}
public String hashFileWithProgress(File file, String algorithm) throws IOException {
return hashFileWithProgress(file, algorithm, null);
}
private String bytesToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02x", b));
}
return result.toString();
}
// Verify file integrity
public boolean verifyFileIntegrity(File file, String expectedHash, String algorithm) throws IOException {
String actualHash = hashFile(file, algorithm);
return actualHash.equalsIgnoreCase(expectedHash);
}
public boolean verifyFileIntegrity(File file, String expectedHash) throws IOException {
return verifyFileIntegrity(file, expectedHash, "SHA-256");
}
}
// 3. Password Hashing
class PasswordHasher {
// Simple password hash (not for production - use bcrypt/argon2 instead)
public String hashPassword(String password, String salt) {
StringHasher hasher = new StringHasher();
return hasher.hashWithSalt(password, salt, "SHA-256");
}
// Generate random salt
public String generateSalt(int length) {
byte[] bytes = new byte[length];
new SecureRandom().nextBytes(bytes);
return bytesToHex(bytes);
}
public String generateSalt() {
return generateSalt(32);
}
private String bytesToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02x", b));
}
return result.toString();
}
// Hash with iterations (slow hash)
public String hashWithIterations(String password, String salt, int iterations) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = (password + salt).getBytes();
for (int i = 0; i < iterations; i++) {
hash = digest.digest(hash);
}
return bytesToHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("SHA-256 not available", e);
}
}
public String hashWithIterations(String password, String salt) {
return hashWithIterations(password, salt, 10000);
}
// Verify password
public boolean verifyPassword(String password, String salt, String expectedHash) {
String actualHash = hashWithIterations(password, salt, 10000);
return actualHash.equalsIgnoreCase(expectedHash);
}
}
// 4. HMAC (Hash-based Message Authentication Code)
class HmacHasher {
// Calculate HMAC-SHA256
public String hmacSha256(String data, String key) {
try {
javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA256");
javax.crypto.spec.SecretKeySpec secretKey =
new javax.crypto.spec.SecretKeySpec(key.getBytes(), "HmacSHA256");
mac.init(secretKey);
byte[] hmac = mac.doFinal(data.getBytes());
return bytesToHex(hmac);
} catch (Exception e) {
throw new RuntimeException("HMAC-SHA256 failed", e);
}
}
// Calculate HMAC-SHA512
public String hmacSha512(String data, String key) {
try {
javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA512");
javax.crypto.spec.SecretKeySpec secretKey =
new javax.crypto.spec.SecretKeySpec(key.getBytes(), "HmacSHA512");
mac.init(secretKey);
byte[] hmac = mac.doFinal(data.getBytes());
return bytesToHex(hmac);
} catch (Exception e) {
throw new RuntimeException("HMAC-SHA512 failed", e);
}
}
// Verify HMAC
public boolean verifyHmac(String data, String key, String expectedHmac, String algorithm) {
String actualHmac;
if ("HmacSHA256".equals(algorithm)) {
actualHmac = hmacSha256(data, key);
} else if ("HmacSHA512".equals(algorithm)) {
actualHmac = hmacSha512(data, key);
} else {
throw new IllegalArgumentException("Unsupported algorithm: " + algorithm);
}
return actualHmac.equalsIgnoreCase(expectedHmac);
}
public boolean verifyHmac(String data, String key, String expectedHmac) {
return verifyHmac(data, key, expectedHmac, "HmacSHA256");
}
private String bytesToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02x", b));
}
return result.toString();
}
}
// 5. Hash Comparison and Utilities
class HashUtilities {
// Compare two hashes securely (prevent timing attacks)
public boolean secureCompare(String hash1, String hash2) {
return MessageDigest.isEqual(hash1.getBytes(), hash2.getBytes());
}
// Generate hash for checksum file
public String generateChecksum(File file) throws IOException {
FileHasher hasher = new FileHasher();
return hasher.sha256File(file);
}
// Create checksum file content
public String createChecksumContent(File file) throws IOException {
String hash = new FileHasher().sha256File(file);
return hash + " " + file.getName();
}
// Parse checksum file
public java.util.Map<String, String> parseChecksumFile(File checksumFile) throws IOException {
java.util.Map<String, String> checksums = new java.util.HashMap<>();
BufferedReader reader = new BufferedReader(new java.io.FileReader(checksumFile));
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split(" ", 2);
if (parts.length == 2) {
checksums.put(parts[1], parts[0]);
}
}
reader.close();
return checksums;
}
// Verify checksums from file
public boolean verifyChecksums(File directory, File checksumFile) throws IOException {
java.util.Map<String, String> checksums = parseChecksumFile(checksumFile);
FileHasher hasher = new FileHasher();
for (java.util.Map.Entry<String, String> entry : checksums.entrySet()) {
String filename = entry.getKey();
String expectedHash = entry.getValue();
File file = new File(directory, filename);
if (!file.exists()) {
System.out.println("File not found: " + filename);
return false;
}
String actualHash = hasher.sha256File(file);
if (!actualHash.equalsIgnoreCase(expectedHash)) {
System.out.println("Checksum mismatch for " + filename);
return false;
}
}
return true;
}
}
// 6. Hash-based Operations
class HashBasedOperations {
// Generate hash-based identifier
public String generateIdentifier(String input) {
String hash = new StringHasher().sha256(input);
return hash.substring(0, 16);
}
// Create content-based hash for deduplication
public String contentHash(String content) {
return new StringHasher().sha256(content);
}
// Hash-based cache key
public String createCacheKey(java.util.Map<String, Object> params) {
java.util.List<String> pairs = new java.util.ArrayList<>();
java.util.List<String> keys = new java.util.ArrayList<>(params.keySet());
java.util.Collections.sort(keys);
for (String key : keys) {
pairs.add(key + "=" + params.get(key));
}
String paramString = android.text.TextUtils.join("&", pairs);
return new StringHasher().sha256(paramString);
}
// Hash-based URL shortener (simplified)
public String shortenUrl(String url) {
String hash = new StringHasher().md5(url);
return hash.substring(0, 8);
}
// Bloom filter hash functions
public java.util.List<Integer> bloomFilterHashes(String item, int numHashes, int filterSize) {
java.util.List<Integer> hashes = new java.util.ArrayList<>();
String hash1 = new StringHasher().sha256(item);
String hash2 = new StringHasher().md5(item);
for (int i = 0; i < numHashes; i++) {
String combined = hash1 + hash2 + i;
String hash = new StringHasher().sha256(combined);
int index = (Integer.parseInt(hash.substring(0, 8), 16) % filterSize);
hashes.add(index);
}
return hashes;
}
}
// Main demonstration
public class HashCalculationDemo {
public static void demonstrateHashCalculation() {
System.out.println("=== Android Java Hash Calculation Examples ===\n");
// 1. String hashing
System.out.println("--- 1. String Hashing ---");
StringHasher stringHasher = new StringHasher();
String text = "Hello, World!";
System.out.println("Text: " + text);
System.out.println("MD5: " + stringHasher.md5(text));
System.out.println("SHA-1: " + stringHasher.sha1(text));
System.out.println("SHA-256: " + stringHasher.sha256(text));
System.out.println("SHA-512: " + stringHasher.sha512(text));
// Hash with salt
String salt = "random_salt_123";
System.out.println("\nHashed with salt '" + salt + "':");
System.out.println(stringHasher.hashWithSalt(text, salt));
// 2. Password hashing
System.out.println("\n--- 2. Password Hashing ---");
PasswordHasher passwordHasher = new PasswordHasher();
String password = "SecurePassword123!";
String generatedSalt = passwordHasher.generateSalt();
System.out.println("Password: " + password);
System.out.println("Generated salt: " + generatedSalt);
String hashedPassword = passwordHasher.hashWithIterations(password, generatedSalt, 10000);
System.out.println("Hashed password: " + hashedPassword);
boolean isValid = passwordHasher.verifyPassword(password, generatedSalt, hashedPassword);
System.out.println("Password verification: " + isValid);
// 3. HMAC
System.out.println("\n--- 3. HMAC ---");
HmacHasher hmacHasher = new HmacHasher();
String data = "Important message";
String key = "secret_key";
String hmac = hmacHasher.hmacSha256(data, key);
System.out.println("Data: " + data);
System.out.println("HMAC-SHA256: " + hmac);
boolean hmacVerified = hmacHasher.verifyHmac(data, key, hmac);
System.out.println("HMAC verification: " + hmacVerified);
// 4. File hashing
System.out.println("\n--- 4. File Hashing ---");
System.out.println("File hashing methods:");
System.out.println(" - hashFile(): Calculate hash for any file");
System.out.println(" - md5File(): Calculate MD5 of file");
System.out.println(" - sha256File(): Calculate SHA-256 of file");
System.out.println(" - hashFileWithProgress(): Track progress for large files");
System.out.println(" - verifyFileIntegrity(): Verify file against expected hash");
// 5. Hash utilities
System.out.println("\n--- 5. Hash Utilities ---");
HashUtilities hashUtils = new HashUtilities();
String hash1 = "abc123";
String hash2 = "abc123";
String hash3 = "xyz789";
System.out.println("Secure compare 'abc123' vs 'abc123': " + hashUtils.secureCompare(hash1, hash2));
System.out.println("Secure compare 'abc123' vs 'xyz789': " + hashUtils.secureCompare(hash1, hash3));
// 6. Hash-based operations
System.out.println("\n--- 6. Hash-Based Operations ---");
HashBasedOperations hashOps = new HashBasedOperations();
String identifier = hashOps.generateIdentifier("unique_item_123");
System.out.println("Generated identifier: " + identifier);
java.util.Map<String, Object> params = new java.util.HashMap<>();
params.put("user", "alice");
params.put("page", 1);
params.put("limit", 20);
String cacheKey = hashOps.createCacheKey(params);
System.out.println("Cache key: " + cacheKey);
String shortUrl = hashOps.shortenUrl("https://example.com/very/long/url/path");
System.out.println("Shortened URL: " + shortUrl);
java.util.List<Integer> bloomHashes = hashOps.bloomFilterHashes("test_item", 3, 1000);
System.out.println("Bloom filter hashes: " + bloomHashes);
System.out.println("\n=== All Hash Calculation Examples Completed ===");
}
}
💻 Criptografia AES java
🔴 complex
⭐⭐⭐⭐⭐
Criptografar e descriptografar dados usando AES com vários modos e esquemas de preenchimento
⏱️ 40 min
🏷️ java, android, cryptography, encryption
Prerequisites:
Advanced Java, Cryptography knowledge
// Android Java AES Encryption Examples
// Using javax.crypto package
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.SecureRandom;
import java.security.spec.KeySpec;
import java.util.Base64;
import java.io.*;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
// Encryption result holder
class EncryptionResult {
public String iv;
public String cipherText;
public EncryptionResult(String iv, String cipherText) {
this.iv = iv;
this.cipherText = cipherText;
}
}
// PBE encryption result holder
class PbeEncryptionResult {
public String salt;
public String iv;
public String cipherText;
public PbeEncryptionResult(String salt, String iv, String cipherText) {
this.salt = salt;
this.iv = iv;
this.cipherText = cipherText;
}
}
// 1. Basic AES Encryption
class BasicAesEncryption {
// Generate AES key
public SecretKey generateKey(int keySize) throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(keySize);
return keyGen.generateKey();
}
public SecretKey generateKey() throws Exception {
return generateKey(256);
}
// Encrypt with AES/GCM/NoPadding
public EncryptionResult encryptGCM(String plainText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
// Generate random IV
byte[] iv = new byte[12];
new SecureRandom().nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] cipherText = cipher.doFinal(plainText.getBytes());
// Return IV and ciphertext as Base64
String ivBase64 = Base64.getEncoder().encodeToString(iv);
String cipherTextBase64 = Base64.getEncoder().encodeToString(cipherText);
return new EncryptionResult(ivBase64, cipherTextBase64);
}
// Decrypt with AES/GCM/NoPadding
public String decryptGCM(String cipherText, String iv, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
byte[] ivBytes = Base64.getDecoder().decode(iv);
byte[] cipherTextBytes = Base64.getDecoder().decode(cipherText);
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] plainText = cipher.doFinal(cipherTextBytes);
return new String(plainText);
}
// Encrypt with AES/CBC/PKCS5Padding
public EncryptionResult encryptCBC(String plainText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Generate random IV (16 bytes for CBC)
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] cipherText = cipher.doFinal(plainText.getBytes());
String ivBase64 = Base64.getEncoder().encodeToString(iv);
String cipherTextBase64 = Base64.getEncoder().encodeToString(cipherText);
return new EncryptionResult(ivBase64, cipherTextBase64);
}
// Decrypt with AES/CBC/PKCS5Padding
public String decryptCBC(String cipherText, String iv, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] ivBytes = Base64.getDecoder().decode(iv);
byte[] cipherTextBytes = Base64.getDecoder().decode(cipherText);
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] plainText = cipher.doFinal(cipherTextBytes);
return new String(plainText);
}
}
// 2. Password-Based Encryption
class PasswordBasedEncryption {
// Derive key from password
public SecretKey deriveKeyFromPassword(
String password,
byte[] salt,
int keySize,
int iterations
) throws Exception {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(
password.toCharArray(),
salt,
iterations,
keySize
);
SecretKey tmp = factory.generateSecret(spec);
return new SecretKeySpec(tmp.getEncoded(), "AES");
}
public SecretKey deriveKeyFromPassword(String password, byte[] salt) throws Exception {
return deriveKeyFromPassword(password, salt, 256, 65536);
}
// Generate random salt
public byte[] generateSalt(int size) {
byte[] salt = new byte[size];
new SecureRandom().nextBytes(salt);
return salt;
}
public byte[] generateSalt() {
return generateSalt(16);
}
// Encrypt with password
public PbeEncryptionResult encryptWithPassword(String plainText, String password) throws Exception {
byte[] salt = generateSalt();
SecretKey key = deriveKeyFromPassword(password, salt);
BasicAesEncryption aes = new BasicAesEncryption();
EncryptionResult result = aes.encryptGCM(plainText, key);
String saltBase64 = Base64.getEncoder().encodeToString(salt);
return new PbeEncryptionResult(saltBase64, result.iv, result.cipherText);
}
// Decrypt with password
public String decryptWithPassword(
String cipherText,
String iv,
String salt,
String password
) throws Exception {
byte[] saltBytes = Base64.getDecoder().decode(salt);
SecretKey key = deriveKeyFromPassword(password, saltBytes);
BasicAesEncryption aes = new BasicAesEncryption();
return aes.decryptGCM(cipherText, iv, key);
}
// Generate key with specific iterations
public SecretKey generateStrongKey(String password, int iterations) throws Exception {
byte[] salt = generateSalt();
return deriveKeyFromPassword(password, salt, 256, iterations);
}
public SecretKey generateStrongKey(String password) throws Exception {
return generateStrongKey(password, 100000);
}
}
// 3. File Encryption
class FileEncryption {
// Encrypt file
public boolean encryptFile(
File inputFile,
File outputFile,
SecretKey key
) {
try {
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
byte[] iv = new byte[12];
new SecureRandom().nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
// Write IV first
FileOutputStream fos = new FileOutputStream(outputFile);
fos.write(iv);
// Encrypt file content
FileInputStream fis = new FileInputStream(inputFile);
CipherOutputStream cipherStream = new CipherOutputStream(fos, cipher);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
cipherStream.write(buffer, 0, bytesRead);
}
cipherStream.close();
fis.close();
return true;
} catch (Exception e) {
System.out.println("Error encrypting file: " + e.getMessage());
return false;
}
}
// Decrypt file
public boolean decryptFile(
File inputFile,
File outputFile,
SecretKey key
) {
try {
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
// Read IV first
FileInputStream fis = new FileInputStream(inputFile);
byte[] iv = new byte[12];
fis.read(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
// Decrypt file content
FileOutputStream fos = new FileOutputStream(outputFile);
CipherInputStream cipherStream = new CipherInputStream(fis, cipher);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = cipherStream.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
cipherStream.close();
fos.close();
return true;
} catch (Exception e) {
System.out.println("Error decrypting file: " + e.getMessage());
return false;
}
}
}
// 4. String Encryption Utilities
class StringEncryptionUtils {
private BasicAesEncryption aes = new BasicAesEncryption();
private PasswordBasedEncryption passwordEnc = new PasswordBasedEncryption();
// Encrypt string to Base64 (combined IV + ciphertext)
public String encryptStringToBase64(String plainText, String password) throws Exception {
PbeEncryptionResult result = passwordEnc.encryptWithPassword(plainText, password);
// Combine salt + iv + ciphertext
String combined = result.salt + ":" + result.iv + ":" + result.cipherText;
return Base64.getEncoder().encodeToString(combined.getBytes());
}
// Decrypt string from Base64
public String decryptStringFromBase64(String encoded, String password) throws Exception {
String combined = new String(Base64.getDecoder().decode(encoded));
String[] parts = combined.split(":", 3);
if (parts.length != 3) {
throw new IllegalArgumentException("Invalid encrypted format");
}
return passwordEnc.decryptWithPassword(parts[2], parts[1], parts[0], password);
}
}
// 5. Advanced AES Operations
class AdvancedAesOperations {
// Encrypt with custom IV
public String encryptWithCustomIV(String plainText, SecretKey key, byte[] iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] cipherText = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(cipherText);
}
// Encrypt with AES-ECB (not recommended for production)
public String encryptECB(String plainText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(cipherText);
}
// Decrypt with AES-ECB
public String decryptECB(String cipherText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] cipherTextBytes = Base64.getDecoder().decode(cipherText);
byte[] plainText = cipher.doFinal(cipherTextBytes);
return new String(plainText);
}
// Generate AES key from bytes
public SecretKey keyFromBytes(byte[] keyBytes) {
if (keyBytes.length != 16 && keyBytes.length != 24 && keyBytes.length != 32) {
throw new IllegalArgumentException("Key must be 16, 24, or 32 bytes");
}
return new SecretKeySpec(keyBytes, "AES");
}
// Generate AES key from password (simple version)
public SecretKey keyFromPassword(String password, int keySize) {
byte[] keyBytes = new byte[keySize / 8];
byte[] passwordBytes = password.getBytes();
System.arraycopy(passwordBytes, 0, keyBytes, 0,
Math.min(passwordBytes.length, keyBytes.length));
return keyFromBytes(keyBytes);
}
public SecretKey keyFromPassword(String password) {
return keyFromPassword(password, 256);
}
}
// 6. Secure Key Management
class KeyManager {
// Store key securely (simplified - Android Keystore requires more setup)
public boolean storeKeyInKeystore(String alias, SecretKey key) {
// Note: Full Android Keystore integration requires additional setup
// This is a simplified example
try {
// In production, use AndroidKeyStore with proper configuration
System.out.println("Key '" + alias + "' would be stored in Android Keystore");
return true;
} catch (Exception e) {
System.out.println("Error storing key: " + e.getMessage());
return false;
}
}
// Load key from keystore (simplified)
public SecretKey loadKeyFromKeystore(String alias) {
// In production, load from Android Keystore
System.out.println("Key '" + alias + "' would be loaded from Android Keystore");
return null;
}
// Generate and store key
public SecretKey generateAndStoreKey(String alias, int keySize) throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(keySize);
SecretKey key = keyGen.generateKey();
if (storeKeyInKeystore(alias, key)) {
return key;
} else {
return null;
}
}
public SecretKey generateAndStoreKey(String alias) throws Exception {
return generateAndStoreKey(alias, 256);
}
}
// Main demonstration
public class AesEncryptionDemo {
public static void demonstrateAesEncryption() throws Exception {
System.out.println("=== Android Java AES Encryption Examples ===\n");
// 1. Basic encryption
System.out.println("--- 1. Basic AES Encryption ---");
BasicAesEncryption aes = new BasicAesEncryption();
SecretKey key = aes.generateKey(256);
System.out.println("Generated AES key: " + key.getAlgorithm());
String plainText = "This is a secret message!";
System.out.println("Plaintext: " + plainText);
EncryptionResult gcmResult = aes.encryptGCM(plainText, key);
System.out.println("\nEncrypted with AES/GCM:");
System.out.println("IV: " + gcmResult.iv);
System.out.println("Ciphertext: " + gcmResult.cipherText);
String decrypted = aes.decryptGCM(gcmResult.cipherText, gcmResult.iv, key);
System.out.println("\nDecrypted: " + decrypted);
// 2. CBC mode
System.out.println("\n--- 2. CBC Mode ---");
EncryptionResult cbcResult = aes.encryptCBC(plainText, key);
System.out.println("Encrypted with AES/CBC:");
System.out.println("Ciphertext: " + cbcResult.cipherText);
String decryptedCbc = aes.decryptCBC(cbcResult.cipherText, cbcResult.iv, key);
System.out.println("Decrypted: " + decryptedCbc);
// 3. Password-based encryption
System.out.println("\n--- 3. Password-Based Encryption ---");
PasswordBasedEncryption passwordEnc = new PasswordBasedEncryption();
String password = "SecurePassword123!";
PbeEncryptionResult pbeResult = passwordEnc.encryptWithPassword(plainText, password);
System.out.println("Encrypted with password:");
System.out.println("Salt: " + pbeResult.salt);
System.out.println("Ciphertext: " + pbeResult.cipherText);
String decryptedPbe = passwordEnc.decryptWithPassword(
pbeResult.cipherText,
pbeResult.iv,
pbeResult.salt,
password
);
System.out.println("Decrypted: " + decryptedPbe);
// 4. String utilities
System.out.println("\n--- 4. String Encryption Utilities ---");
StringEncryptionUtils stringUtils = new StringEncryptionUtils();
String base64Encrypted = stringUtils.encryptStringToBase64("Hello, World!", password);
System.out.println("Base64 encrypted: " + base64Encrypted);
String base64Decrypted = stringUtils.decryptStringFromBase64(base64Encrypted, password);
System.out.println("Decrypted: " + base64Decrypted);
// 5. Advanced operations
System.out.println("\n--- 5. Advanced Operations ---");
AdvancedAesOperations advancedOps = new AdvancedAesOperations();
byte[] customIv = new byte[16];
new SecureRandom().nextBytes(customIv);
String customEncrypted = advancedOps.encryptWithCustomIV(plainText, key, customIv);
System.out.println("Encrypted with custom IV: " + customEncrypted);
// Note: File encryption requires actual files
System.out.println("\n--- 6. File Encryption ---");
System.out.println("File encryption methods:");
System.out.println(" - encryptFile(): Encrypt entire file");
System.out.println(" - decryptFile(): Decrypt encrypted file");
// 7. Key management
System.out.println("\n--- 7. Key Management ---");
KeyManager keyManager = new KeyManager();
System.out.println("Key management methods:");
System.out.println(" - generateAndStoreKey(): Generate and store in Android Keystore");
System.out.println(" - loadKeyFromKeystore(): Load stored key");
System.out.println(" - keyFromBytes(): Create key from byte array");
System.out.println(" - keyFromPassword(): Derive key from password");
System.out.println("\n=== All AES Encryption Examples Completed ===");
}
}