... is Sun proprietary API and may be removed in a future release

babuschka

Top Contributor
Schlüsselwörter für Suchende: Verschlüsseln, AES, DES...

Hallo!

Proprietär klingt nach Kosten :-(

may be removed in a future realease nach angekündigtem Ärger...

Wie gehe ich vor,. wenn der Compiler folgende Meldung ausspuckt?
warning: sun.misc.BASE64Encoder is Sun proprietary API and may be removed in a future release

Muss hier umkodiert werden, weil es die Klasse "BASE64Encoder" irgendwann gar nicht mehr geben wird?
Ich hoffe nicht!

Ich vermute und hoffe, eine schön einfach zu beantwortende Frage zu stellen :)

Den Code habe ich aus dem Buch Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 26.6 Verschlüsseln von Daten(-strömen) (Kapitel 26.6.3)

Zum Nachvollziehen ein KSKB (Falls jemand trotzdem damit Verschlüsseln mag....es funzt noch):
Code:
package desencrypter;

import java.io.UnsupportedEncodingException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public class DesEncrypter {
    Cipher ecipher;
    Cipher dcipher;

    // 8-byte Salt
    byte[] salt = {
        (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
        (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
    };

    // Iteration count
    int iterationCount = 19;

    public DesEncrypter(String passPhrase) {
        try {
            // Create the key
            KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
            SecretKey key = SecretKeyFactory.getInstance(
                "PBEWithMD5AndDES").generateSecret(keySpec);
            ecipher = Cipher.getInstance(key.getAlgorithm());
            dcipher = Cipher.getInstance(key.getAlgorithm());

            // Prepare the parameter to the ciphers
            AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

            // Create the ciphers
            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        } catch (java.security.InvalidAlgorithmParameterException e) {
        } catch (java.security.spec.InvalidKeySpecException e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch (java.security.NoSuchAlgorithmException e) {
        } catch (java.security.InvalidKeyException e) {
        }
    }

    public String encrypt(String str) {
        try {
            // Encode the string into bytes using utf-8
            byte[] utf8 = str.getBytes("UTF8");

            // Encrypt
            byte[] enc = ecipher.doFinal(utf8);

            // Encode bytes to base64 to get a string
            return new sun.misc.BASE64Encoder().encode(enc);
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
    }

    public String decrypt(String str) {
        try {
            // Decode base64 to get bytes
            byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

            // Decrypt
            byte[] utf8 = dcipher.doFinal(dec);

            // Decode using utf-8
            return new String(utf8, "UTF8");
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
    }


    public static void main( String[] args ) throws Exception {
        try {
            // Create encrypter/decrypter class
            DesEncrypter encrypter = new DesEncrypter("keystring");

            String string = "Mein Passwort";

            // Encrypt
            String encrypted = encrypter.encrypt(string);

            // Decrypt
            String decrypted = encrypter.decrypt(encrypted);

            System.out.println("Unverschlüsselt: " + string);
            System.out.println("Verschlüsselt: " + encrypted);
            System.out.println("Unverschlüsselt: " + decrypted);
        } catch (Exception e) {}
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Tobias

Top Contributor
Die Klassen in den com.sun.*-Packages stellen nur die Sun-Implementierung des Java-Standards dar. Dein Code ist so auf etwa einer IBM-JVM nicht lauffähig. Außerdem garantiert Sun nicht dafür, dass diese Klasse so erhalten bleiben (sie sind schließlich nicht Teil des "öffentlichen" APIs).

Lösung: Keine Klassen aus com.sun.* benutzen.
 

babuschka

Top Contributor
Hallo nochmal für an Verschlüsselung Interessierte.
Mein obiger Code liefert nach Anpassung (s.u.) mit dem Apache-Code

(Download: Codec - Download Commons Codec) im Compiler keine Warning:

Code:
package lib;

import java.io.UnsupportedEncodingException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Base64;

public class DesEncrypter {
    Cipher ecipher;
    Cipher dcipher;

    // 8-byte Salt
    byte[] salt = {
        (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
        (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
    };

    // Iteration count
    int iterationCount = 19;

    public DesEncrypter(String passPhrase) {
        try {
            // Create the key
            KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
            SecretKey key = SecretKeyFactory.getInstance(
                "PBEWithMD5AndDES").generateSecret(keySpec);
            ecipher = Cipher.getInstance(key.getAlgorithm());
            dcipher = Cipher.getInstance(key.getAlgorithm());

            // Prepare the parameter to the ciphers
            AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

            // Create the ciphers
            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        } catch (java.security.InvalidAlgorithmParameterException e) {
        } catch (java.security.spec.InvalidKeySpecException e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch (java.security.NoSuchAlgorithmException e) {
        } catch (java.security.InvalidKeyException e) {
        }
    }

    public String encrypt(String str) {
        String encoded = null;
        try {
            // Encode the string into bytes using utf-8
            byte[] utf8 = str.getBytes("UTF8");

            // Encrypt
            byte[] enc = ecipher.doFinal(utf8);

            // Encode bytes to base64 to get a string
            encoded = Base64.encodeBase64String(enc);

        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return encoded;
    }

    public String decrypt(String str) {
        try {
            // Decode base64 to get bytes
            byte[] decoded = Base64.decodeBase64(str.getBytes());

            // Decrypt
            byte[] utf8 = dcipher.doFinal(decoded);

            // Decode using utf-8
            return new String(utf8, "UTF8");
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
    }


    public static void main( String[] args ) throws Exception {
        try {
            // Create encrypter/decrypter class
            DesEncrypter encrypter = new DesEncrypter("keystring");

            String string = "abcdefgh";

            // Encrypt
            String encrypted = encrypter.encrypt(string);

            // Decrypt
            String decrypted = encrypter.decrypt(encrypted);

            System.out.println(string);
            System.out.println(encrypted);
            System.out.println(decrypted);
        } catch (Exception e) {}
    }
}
 

Ähnliche Java Themen

Neue Themen


Oben