2016-12-15 3 views
1

Ich brauche eine Key generieren, um es für die Verschlüsselung und Entschlüsselung mit einem AES-Chiffre verwenden.Java AES: Erzeuge Schlüssel mit einer einzigen ID als Quelle

Der Schlüssel muss zur Laufzeit mit einem einzelnen id Wert generiert werden.

Wie könnte ich eine Key generieren, die eine einzelne Zeichenfolge als Quelle verwendet?

+0

Als Ausgangspunkt: http://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#SecretKeyFactory (obwohl die Beispiele selbst etwas veraltet) –

Antwort

-1

Hoffe, das kann Ihnen helfen.

package com.lahiru.security; 
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
import java.util.Base64; 

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 

public class AESEncryptionDecryption { 

    private static SecretKeySpec secretKey; 
    private static byte[] key; 

    public static void main(String[] args){ 
     String id = "00001"; 
     String plainText = "This is plain text"; 

     String cipherText = encrypt(plainText, id); 
     System.out.println("Cipher Text after encrption ::: " + cipherText); 
     System.out.println("Plain Text after decryption ::: " + decrypt(cipherText, id)); 

    } 


    public static void setKey(String myKey) 
    { 
     MessageDigest sha = null; 
     try { 
      key = myKey.getBytes("UTF-8"); 
      sha = MessageDigest.getInstance("SHA-1"); 
      key = sha.digest(key); 
      key = Arrays.copyOf(key, 16); 
      secretKey = new SecretKeySpec(key, "AES"); 
     } 
     catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } 
     catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static String encrypt(String strToEncrypt, String secret) 
    { 
     try 
     { 
      setKey(secret); 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
      return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))); 
     } 
     catch (Exception e) 
     { 
      System.out.println("Error while encrypting: " + e.toString()); 
     } 
     return null; 
    } 

    public static String decrypt(String strToDecrypt, String secret) 
    { 
     try 
     { 
      setKey(secret); 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); 
      cipher.init(Cipher.DECRYPT_MODE, secretKey); 
      return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt))); 
     } 
     catch (Exception e) 
     { 
      System.out.println("Error while decrypting: " + e.toString()); 
     } 
     return null; 
    } 
} 
+1

Die Verwendung einer Hash-Funktion (SHA-1) ist nicht ausreichend und selbst das Hinzufügen eines Salzes trägt wenig zur Verbesserung der Sicherheit bei. Stattdessen iterieren Sie über einen HMAC mit einem zufälligen Salz für etwa 100ms und speichern Sie das Salz mit dem Hash. Verwenden Sie Funktionen wie 'PBKDF2' (aka' Rfc2898DeriveBytes'), 'password_hash' /' password_verify', 'BCrypt' und ähnliche Funktionen. Es geht darum, den Angreifer dazu zu bringen, viel Zeit mit der Suche nach Passwörtern zu verbringen. Schützen Sie Ihre Benutzer ist wichtig, bitte verwenden Sie sichere Passwort-Methoden. – zaph

+1

Verwenden Sie nicht den ECB-Modus, es ist unsicher, siehe [ECB-Modus] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29), scrollen Sie nach unten zum Penguin. Verwenden Sie stattdessen den CBC-Modus mit einer zufälligen IV, und weisen Sie den verschlüsselten Daten die IV für die Entschlüsselung vor. – zaph

Verwandte Themen