Chris Lu
5 years ago
11 changed files with 308 additions and 59 deletions
-
15other/java/client/pom.xml
-
33other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java
-
37other/java/client/src/main/java/seaweedfs/client/Gzip.java
-
55other/java/client/src/main/java/seaweedfs/client/SeaweedCipher.java
-
137other/java/client/src/main/java/seaweedfs/client/SeaweedRead.java
-
40other/java/client/src/main/java/seaweedfs/client/SeaweedWrite.java
-
42other/java/client/src/test/java/seaweedfs/client/SeaweedCipherTest.java
-
2other/java/hdfs2/dependency-reduced-pom.xml
-
2other/java/hdfs2/pom.xml
-
2other/java/hdfs3/dependency-reduced-pom.xml
-
2other/java/hdfs3/pom.xml
@ -0,0 +1,37 @@ |
|||||
|
package seaweedfs.client; |
||||
|
|
||||
|
import java.io.ByteArrayInputStream; |
||||
|
import java.io.ByteArrayOutputStream; |
||||
|
import java.io.IOException; |
||||
|
import java.io.InputStream; |
||||
|
import java.util.zip.GZIPInputStream; |
||||
|
import java.util.zip.GZIPOutputStream; |
||||
|
|
||||
|
public class Gzip { |
||||
|
public static byte[] compress(byte[] data) throws IOException { |
||||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length); |
||||
|
GZIPOutputStream gzip = new GZIPOutputStream(bos); |
||||
|
gzip.write(data); |
||||
|
gzip.close(); |
||||
|
byte[] compressed = bos.toByteArray(); |
||||
|
bos.close(); |
||||
|
return compressed; |
||||
|
} |
||||
|
|
||||
|
public static byte[] decompress(byte[] compressed) throws IOException { |
||||
|
ByteArrayInputStream bis = new ByteArrayInputStream(compressed); |
||||
|
GZIPInputStream gis = new GZIPInputStream(bis); |
||||
|
return readAll(gis); |
||||
|
} |
||||
|
|
||||
|
private static byte[] readAll(InputStream input) throws IOException { |
||||
|
try( ByteArrayOutputStream output = new ByteArrayOutputStream()){ |
||||
|
byte[] buffer = new byte[4096]; |
||||
|
int n; |
||||
|
while (-1 != (n = input.read(buffer))) { |
||||
|
output.write(buffer, 0, n); |
||||
|
} |
||||
|
return output.toByteArray(); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,55 @@ |
|||||
|
package seaweedfs.client; |
||||
|
|
||||
|
import javax.crypto.Cipher; |
||||
|
import javax.crypto.spec.GCMParameterSpec; |
||||
|
import javax.crypto.spec.SecretKeySpec; |
||||
|
import java.security.SecureRandom; |
||||
|
|
||||
|
public class SeaweedCipher { |
||||
|
// AES-GCM parameters |
||||
|
public static final int AES_KEY_SIZE = 256; // in bits |
||||
|
public static final int GCM_NONCE_LENGTH = 12; // in bytes |
||||
|
public static final int GCM_TAG_LENGTH = 16; // in bytes |
||||
|
|
||||
|
private static SecureRandom random = new SecureRandom(); |
||||
|
|
||||
|
public static byte[] genCipherKey() throws Exception { |
||||
|
byte[] key = new byte[AES_KEY_SIZE / 8]; |
||||
|
random.nextBytes(key); |
||||
|
return key; |
||||
|
} |
||||
|
|
||||
|
public static byte[] encrypt(byte[] clearTextbytes, byte[] cipherKey) throws Exception { |
||||
|
return encrypt(clearTextbytes, 0, clearTextbytes.length, cipherKey); |
||||
|
} |
||||
|
|
||||
|
public static byte[] encrypt(byte[] clearTextbytes, int offset, int length, byte[] cipherKey) throws Exception { |
||||
|
|
||||
|
final byte[] nonce = new byte[GCM_NONCE_LENGTH]; |
||||
|
random.nextBytes(nonce); |
||||
|
GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce); |
||||
|
SecretKeySpec keySpec = new SecretKeySpec(cipherKey, "AES"); |
||||
|
|
||||
|
Cipher AES_cipherInstance = Cipher.getInstance("AES/GCM/NoPadding"); |
||||
|
AES_cipherInstance.init(Cipher.ENCRYPT_MODE, keySpec, spec); |
||||
|
|
||||
|
byte[] encryptedText = AES_cipherInstance.doFinal(clearTextbytes, offset, length); |
||||
|
|
||||
|
byte[] iv = AES_cipherInstance.getIV(); |
||||
|
byte[] message = new byte[GCM_NONCE_LENGTH + clearTextbytes.length + GCM_TAG_LENGTH]; |
||||
|
System.arraycopy(iv, 0, message, 0, GCM_NONCE_LENGTH); |
||||
|
System.arraycopy(encryptedText, 0, message, GCM_NONCE_LENGTH, encryptedText.length); |
||||
|
|
||||
|
return message; |
||||
|
} |
||||
|
|
||||
|
public static byte[] decrypt(byte[] encryptedText, byte[] cipherKey) throws Exception { |
||||
|
final Cipher AES_cipherInstance = Cipher.getInstance("AES/GCM/NoPadding"); |
||||
|
GCMParameterSpec params = new GCMParameterSpec(GCM_TAG_LENGTH * 8, encryptedText, 0, GCM_NONCE_LENGTH); |
||||
|
SecretKeySpec keySpec = new SecretKeySpec(cipherKey, "AES"); |
||||
|
AES_cipherInstance.init(Cipher.DECRYPT_MODE, keySpec, params); |
||||
|
byte[] decryptedText = AES_cipherInstance.doFinal(encryptedText, GCM_NONCE_LENGTH, encryptedText.length - GCM_NONCE_LENGTH); |
||||
|
return decryptedText; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,42 @@ |
|||||
|
package seaweedfs.client; |
||||
|
|
||||
|
import org.junit.Test; |
||||
|
|
||||
|
import java.util.Base64; |
||||
|
|
||||
|
import static seaweedfs.client.SeaweedCipher.decrypt; |
||||
|
import static seaweedfs.client.SeaweedCipher.encrypt; |
||||
|
|
||||
|
public class SeaweedCipherTest { |
||||
|
|
||||
|
@Test |
||||
|
public void testSameAsGoImplemnetation() throws Exception { |
||||
|
byte[] secretKey = "256-bit key for AES 256 GCM encr".getBytes(); |
||||
|
|
||||
|
String plainText = "Now we need to generate a 256-bit key for AES 256 GCM"; |
||||
|
|
||||
|
System.out.println("Original Text : " + plainText); |
||||
|
|
||||
|
byte[] cipherText = encrypt(plainText.getBytes(), secretKey); |
||||
|
System.out.println("Encrypted Text : " + Base64.getEncoder().encodeToString(cipherText)); |
||||
|
|
||||
|
byte[] decryptedText = decrypt(cipherText, secretKey); |
||||
|
System.out.println("DeCrypted Text : " + new String(decryptedText)); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testEncryptDecrypt() throws Exception { |
||||
|
byte[] secretKey = SeaweedCipher.genCipherKey(); |
||||
|
|
||||
|
String plainText = "Now we need to generate a 256-bit key for AES 256 GCM"; |
||||
|
|
||||
|
System.out.println("Original Text : " + plainText); |
||||
|
|
||||
|
byte[] cipherText = encrypt(plainText.getBytes(), secretKey); |
||||
|
System.out.println("Encrypted Text : " + Base64.getEncoder().encodeToString(cipherText)); |
||||
|
|
||||
|
byte[] decryptedText = decrypt(cipherText, secretKey); |
||||
|
System.out.println("DeCrypted Text : " + new String(decryptedText)); |
||||
|
} |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue