web-dev-qa-db-fra.com

Vérification de la disponibilité de la cryptographie illimitée

Comment puis-je vérifier, en Java, si la JVM actuelle a une cryptographie de force illimitée disponible?

44
Chi-Lan

Je pense que vous pourriez probablement utiliser Cipher.getMaxAllowedKeyLength () , tout en comparant également le chiffre que vous utilisez à des listes connues de "bons" cyphers sécurisés, tels que AES.

Voici un article de référence qui répertorie les limitations de compétence de taille de clé maximales qui étaient en vigueur au Java 1.4 (celles-ci n'ont probablement pas changé, sauf si la loi a également changé - voir au dessous de).

Si vous opérez dans une nation qui a des restrictions d'import/export cryptographiques, vous devrez consulter la loi de votre nation, mais il est probablement sûr de supposer dans ces situations que vous ne le faites pas ont une cryptographie de force illimitée disponible (par défaut) dans votre JVM. Autrement dit, en supposant que vous utilisez la JVM officielle d'Oracle , et que vous vivez dans un pays contre lequel les États-Unis ont imposé des restrictions à l'exportation pour la cryptographie (et puisque Oracle est une société américaine , il serait soumis à ces restrictions), vous pouvez également supposer dans ce cas que vous ne disposez pas d'une force illimitée.

Bien sûr, cela ne vous empêche pas de construire le vôtre , et vous accordant ainsi une force illimitée, mais selon vos lois locales, cela pourrait être illégal.

Cet article décrit les restrictions à l'exportation vers d'autres pays, des États-Unis.

25
jefflunt

Dans le même esprit que la réponse de Dan Cruz, mais avec une seule ligne de code et sans passer par des exceptions:

boolean limit = Cipher.getMaxAllowedKeyLength("RC5")<256;

Un programme complet pourrait donc être:

import javax.crypto.Cipher;

public class TestUCE {
  public static void main(String args[]) throws Exception {
    boolean unlimited =
      Cipher.getMaxAllowedKeyLength("RC5") >= 256;
    System.out.println("Unlimited cryptography enabled: " + unlimited);
  }
}
43
KonstantinSpirov

Si vous êtes sous Linux et que vous avez installé le JDK (mais Beanshell n'est pas disponible), vous pouvez vérifier avec la commande runscript fournie avec le JDK.

jrunscript -e 'exit (javax.crypto.Cipher.getMaxAllowedKeyLength("RC5") >= 256 ? 0 : 1);'; echo $?

Cela renvoie un 0 code d'état si la cryptographie illimitée est disponible, ou 1 Si ce n'est pas disponible. Zéro est la valeur de retour "succès" correcte pour les fonctions Shell, et non nul indique une défaillance.

34
Igor Metz

La façon de vérifier si des restrictions s'appliquent est documentée dans la méthode Cipher.getMaxAllowedKeyLength :

Si des fichiers de stratégie de juridiction JCE de force illimitée sont installés, Integer.MAX_VALUE sera retourné.

Cela signifie que si une valeur autre que (ou même inférieure à) Integer.MAX_VALUE est renvoyé, des restrictions s'appliquent.

Encore plus d'informations sont dans le JavaDoc de la méthode ci-dessous:

/**
 * Determines if cryptography restrictions apply.
 * Restrictions apply if the value of {@link Cipher#getMaxAllowedKeyLength(String)} returns a value smaller than {@link Integer#MAX_VALUE} if there are any restrictions according to the JavaDoc of the method.
 * This method is used with the transform <code>"AES/CBC/PKCS5Padding"</code> as this is an often used algorithm that is <a href="https://docs.Oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#impl">an implementation requirement for Java SE</a>.
 * 
 * @return <code>true</code> if restrictions apply, <code>false</code> otherwise
 */
public static boolean restrictedCryptography() {
    try {
        return Cipher.getMaxAllowedKeyLength("AES/CBC/PKCS5Padding") < Integer.MAX_VALUE;
    } catch (final NoSuchAlgorithmException e) {
        throw new IllegalStateException("The transform \"AES/CBC/PKCS5Padding\" is not available (the availability of this algorithm is mandatory for Java SE implementations)", e);
    }
}

Notez que depuis Java 9 les politiques de cryptage illimitées sont installées par défaut (avec celles affectées par les réglementations d'importation/exportation devant installer le limited politiques de chiffrement à la place. Donc, ce code serait principalement requis pour la compatibilité descendante et/ou d'autres runtimes.

16
Maarten Bodewes

Ceci est une version complète de copier-coller pour permettre les tests

import javax.crypto.Cipher;
import Java.security.NoSuchAlgorithmException;

class Test {
    public static void main(String[] args) {
        int allowedKeyLength = 0;

        try {
            allowedKeyLength = Cipher.getMaxAllowedKeyLength("AES");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        System.out.println("The allowed key length for AES is: " + allowedKeyLength);
    }
}

Courir

javac Test.Java

Java Test

Si JCE ne fonctionne pas, la sortie: 128 JCE fonctionne quelque chose comme: 2147483647

5
code

Si vous utilisez Linux, vous pouvez le vérifier facilement avec cette commande

Java -version ; \
echo 'System.err.println(javax.crypto.Cipher.getInstance("AES/CBC/PKCS5Padding").getMaxAllowedKeyLength("AES"));'  \
| Java -cp /usr/share/Java/bsh-*.jar bsh.Interpreter >/dev/null

Si la sortie est quelque chose comme ça, la cryptographie de force illimitée n'est pas disponible

Java version "1.7.0_76"
Java(TM) SE Runtime Environment (build 1.7.0_76-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode)
128
3
cklar

Vous pouvez le vérifier en une seule étape depuis la ligne de commande en utilisant groovy:

groovysh -e 'javax.crypto.Cipher.getMaxAllowedKeyLength("AES")'

Si le résultat est 2147483647, vous disposez d'une cryptographie illimitée.

Sur les anciennes versions de groovy, vous devez supprimer le -e:

groovysh 'javax.crypto.Cipher.getMaxAllowedKeyLength("AES")'
2
Ortomala Lokni

[~ # ~] note [~ # ~] : veuillez utiliser réponse de jefflunt ou réponse de KonstantinSpirov =. Cette réponse n'est pas une réponse valide car elle renverra toujours true. Je ne laisse cette réponse ici que parce qu'elle est référencée ailleurs dans les réponses et les commentaires et n'est utile qu'à titre de référence.


Vous pouvez utiliser ce qui suit pour initialiser un static final boolean quelque part que vous pouvez ensuite utiliser pour tester la prise en charge illimitée de la cryptographie (car AES 256 bits n'est pris en charge que si la stratégie sans restriction est installée).

boolean isUnlimitedSupported = false;
try {
    KeyGenerator kgen = KeyGenerator.getInstance("AES", "SunJCE");
    kgen.init(256);
    isUnlimitedSupported = true;
} catch (NoSuchAlgorithmException e) {
    isUnlimitedSupported = false;
} catch (NoSuchProviderException e) {
    isUnlimitedSupported = false;
}
System.out.println("isUnlimitedSupported=" + isUnlimitedSupported);
// set static final variable = isUnlimitedSupported;
0
Dan Cruz