Skip to content
Snippets Groups Projects
Commit 703bd6c4 authored by Mat Mir's avatar Mat Mir
Browse files

Migration sur Gitlab

parents
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
target
.project 0 → 100644
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>code-review</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding/<project>=UTF-8
eclipse.preferences.version=1
org.eclipse.jdt.apt.aptEnabled=false
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
org.eclipse.jdt.core.compiler.compliance=17
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=17
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
# Vérificateur de robustesse de mots de passe
Ce projet maven est composé d'une classe permettant de vérifier la robustesse
de mots de passes. Leur robustesse est estimée en comparant leur distance
avec des données expérimentales décrites dans le fichier
`cluster-centers_HAC_aff.csv`.
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<!--
Checkstyle configuration that checks the Marmor coding conventions.
Checkstyle is very configurable. Be sure to read the documentation at
http://checkstyle.sf.net (or in your downloaded distribution).
Most Checks are configurable, be sure to consult the documentation.
To completely disable a check, just comment it out or delete it from the file.
Authors: : Maxime ESCOURBIAC.
-->
<module name = "Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="error"/>
<property name="fileExtensions" value="java, properties, xml"/>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<module name="TreeWalker">
<module name="OuterTypeFilename"/>
<module name="IllegalTokenText">
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
<property name="format" value="\\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
<property name="message" value="Avoid using corresponding octal or Unicode escape."/>
</module>
<module name="AvoidEscapedUnicodeCharacters">
<property name="allowEscapesForControlCharacters" value="true"/>
<property name="allowByTailComment" value="true"/>
<property name="allowNonPrintableEscapes" value="true"/>
</module>
<module name="LineLength">
<property name="max" value="256"/>
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<module name="AvoidStarImport"/>
<module name="OneTopLevelClass"/>
<module name="NoLineWrap"/>
<module name="EmptyBlock">
<property name="option" value="TEXT"/>
<property name="tokens" value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
</module>
<module name="NeedBraces"/>
<module name="LeftCurly">
<property name="maxLineLength" value="100"/>
</module>
<module name="RightCurly"/>
<module name="RightCurly">
<property name="option" value="alone"/>
<property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
</module>
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
<message key="ws.notFollowed"
value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
<message key="ws.notPreceded"
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
</module>
<module name="OneStatementPerLine"/>
<module name="MultipleVariableDeclarations"/>
<module name="ArrayTypeStyle"/>
<module name="MissingSwitchDefault"/>
<module name="FallThrough"/>
<module name="UpperEll"/>
<module name="ModifierOrder"/>
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="COMMA"/>
<property name="option" value="EOL"/>
</module>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9_]*)*$"/>
<message key="name.invalidPattern"
value="Package name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="TypeName">
<message key="name.invalidPattern"
value="Type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MemberName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Member name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ParameterName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="LocalVariableName">
<property name="tokens" value="VARIABLE_DEF"/>
<property name="format" value="^[a-zA-Z0-9]*$"/>
<property name="allowOneCharVarInForLoop" value="true"/>
<message key="name.invalidPattern"
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ClassTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MethodTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Method type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="NoFinalizer"/>
<module name="GenericWhitespace">
<message key="ws.followed"
value="GenericWhitespace ''{0}'' is followed by whitespace."/>
<message key="ws.preceded"
value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
<message key="ws.illegalFollow"
value="GenericWhitespace ''{0}'' should followed by whitespace."/>
<message key="ws.notPreceded"
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
</module>
<module name="Indentation">
<property name="basicOffset" value="4"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="0"/>
<property name="throwsIndent" value="4"/>
<property name="lineWrappingIndentation" value="4"/>
<property name="arrayInitIndent" value="2"/>
</module>
<module name="AbbreviationAsWordInName">
<property name="ignoreFinal" value="false"/>
<property name="allowedAbbreviationLength" value="1"/>
</module>
<module name="OverloadMethodsDeclarationOrder"/>
<module name="VariableDeclarationUsageDistance"/>
<module name="CustomImportOrder">
<property name="specialImportsRegExp" value="^javax\."/>
<property name="standardPackageRegExp" value="^java\."/>
<property name="sortImportsInGroupAlphabetically" value="true"/>
<property name="separateLineBetweenGroups" value="false"/>
</module>
<module name="MethodParamPad"/>
<module name="OperatorWrap">
<property name="option" value="NL"/>
<property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
</module>
<module name="AnnotationLocation">
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
</module>
<module name="AnnotationLocation">
<property name="tokens" value="VARIABLE_DEF"/>
<property name="allowSamelineMultipleAnnotations" value="true"/>
</module>
<module name="NonEmptyAtclauseDescription"/>
<module name="JavadocTagContinuationIndentation"/>
<module name="SummaryJavadocCheck">
<property name="forbiddenSummaryFragments" value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
</module>
<module name="JavadocParagraph"/>
<module name="AtclauseOrder">
<property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
<property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
</module>
<module name="JavadocMethod">
<property name="scope" value="public"/>
<property name="allowMissingParamTags" value="true"/>
<property name="allowMissingThrowsTags" value="true"/>
<property name="allowMissingReturnTag" value="true"/>
<property name="minLineCount" value="2"/>
<property name="allowedAnnotations" value="Override, Test"/>
<property name="allowThrowsTagsForSubclasses" value="true"/>
</module>
<module name="MethodName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
<message key="name.invalidPattern"
value="Method name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="SingleLineJavadoc">
<property name="ignoreInlineTags" value="false"/>
</module>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected"/>
</module>
<module name="CommentsIndentation"/>
</module>
</module>
pom.xml 0 → 100644
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fr.isima.codereview</groupId>
<artifactId>code-review</artifactId>
<version>1.0</version>
<name>code-review</name>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Define dependencies versions -->
<unirest.version>3.13.0</unirest.version>
<jackson-annotations.version>2.3.3</jackson-annotations.version>
<log4j.version>2.17.1</log4j.version>
<commons-net.version>3.9.0</commons-net.version>
<commons-codec.version>1.15</commons-codec.version>
<axis.version>1.4</axis.version>
<axis-jaxrpc.version>1.4</axis-jaxrpc.version>
<commons-logging.version>1.2</commons-logging.version>
<commons-discovery.version>0.5</commons-discovery.version>
<axis-wsdl4j.version>1.5.1</axis-wsdl4j.version>
<axis-saaj.version>1.4</axis-saaj.version>
<activation.version>1.1.1</activation.version>
<mail.version>1.4.7</mail.version>
<!-- Define test dependencies versions -->
<junit.version>4.13.2</junit.version>
<!-- Define plugins versions -->
<checkstyle.version>2.17</checkstyle.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.11.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<!-- Optionally: parameterized tests support -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.4.0</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
</configuration>
<executions>
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.12.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.6.1</version>
</plugin>
<!-- Checkstyle plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>${checkstyle.version}</version>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<excludes>biz/futureware/mantisconnect/*</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
package fr.isima.codereview;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
public final class AwesomePasswordChecker {
private static AwesomePasswordChecker instance;
private final List<double[]> clusterCenters = new ArrayList<>();
/**
* Renvoie l'instance unique de AwesomePasswordChecker (singleton) initialisé
* avec un fichier de configuration en paramètre.
*
* @param file Fichier de configuration à utiliser.
* @return L'instance de AwesomePasswordChecker.
* @throws IOException S'il y a erreur dans l'ouverture de file.
*/
public static AwesomePasswordChecker getInstance(File file) throws IOException {
if (instance == null) {
instance = new AwesomePasswordChecker(new FileInputStream(file));
}
return instance;
}
/**
* Renvoie l'instance unique de AwesomePasswordChecker (singleton) initialisé
* avec un fichier de configuration par défaut : cluster_centers_HAC_aff.csv.
*
* @return L'instance de {@link AwesomePasswordChecker}
* @throws IOException S'il y a erreur dans l'ouverture du fichier de
* configuration par défaut.
*/
public static AwesomePasswordChecker getInstance() throws IOException {
if (instance == null) {
InputStream is = AwesomePasswordChecker.class.getClassLoader()
.getResourceAsStream("cluster_centers_HAC_aff.csv");
instance = new AwesomePasswordChecker(is);
}
return instance;
}
/**
* Crée un password checker à partir d'un {@link InputStream}. Cet
* {@link InputStream} pointe vers un texte au format CSV représentant
* des clusters de distances de "mauvais" mots de passes.
*
* @param is InputStream pointant vers des listes de nombres séparés
* par une virgule.
* @throws IOException S'il y a erreur dans la lecture de is
*/
private AwesomePasswordChecker(InputStream is) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
String[] values = line.split(",");
double[] center = new double[values.length];
for (int i = 0; i < values.length; ++i) {
center[i] = Double.parseDouble(values[i]);
}
clusterCenters.add(center);
}
br.close();
}
/**
* Transforme un mot de passe en un masque représentant la robustesse de
* chaque caractère du mot de passe.
*
* @param password Le mot de passe à analyser
* @return Le masque représentant la robustesse de ce mot de passe
*/
public int[] maskAff(String password) {
int[] maskArray = new int[28];
int limit = Math.min(password.length(), 28);
for (int i = 0; i < limit; ++i) {
char letter = password.charAt(i);
switch (letter) {
case 'e':
case 's':
case 'a':
case 'i':
case 't':
case 'n':
case 'r':
case 'u':
case 'o':
case 'l':
maskArray[i] = 1;
break;
case 'E':
case 'S':
case 'A':
case 'I':
case 'T':
case 'N':
case 'R':
case 'U':
case 'O':
case 'L':
maskArray[i] = 3;
break;
case '>':
case '<':
case '-':
case '?':
case '.':
case '/':
case '!':
case '%':
case '@':
case '&':
maskArray[i] = 6;
break;
default:
if (Character.isLowerCase(letter)) {
maskArray[i] = 2;
} else if (Character.isUpperCase(letter)) {
maskArray[i] = 4;
} else if (Character.isDigit(letter)) {
maskArray[i] = 5;
} else {
maskArray[i] = 7;
}
}
}
return maskArray;
}
/**
* Récupère la distance la plus petite entre le masque du mot de passe et
* l'ensemble des clusters de cette classe (clusters initialisés dans le
* constructeur).
*
* @param password Le mot de passe dont on veut récupérer la distance
* minimale.
* @return La distance euclidienne minimale entre le mot de passe et
* le fichier de configuration.
*/
public double getDistance(String password) {
int[] maskArray = maskAff(password);
double minDistance = Double.MAX_VALUE;
for (double[] center : clusterCenters) {
minDistance = Math.min(
euclideanDistance(maskArray, center), minDistance);
}
return minDistance;
}
/**
* Renvoie la distance euclidienne entre les deux tableaux vus comme
* des coordonnées dans un espace euclidien. Les deux tableaux sont
* supposés de même taille.
*
* @param password1 Le masque du mot de passe à tester.
* @param password2 Le masque auquel comparer celui du mot de passe
* @return Distance euclidienne entre les deux mots de passe.
*/
private double euclideanDistance(int[] password1 , double[] password2) {
double sum = 0;
for (int i = 0; i < password1.length; i++) {
sum += (password1[i] - password2[i])
* (password1[i] - password2[i]);
}
return Math.sqrt(sum);
}
/**
* Calcule le résultat du hachage de l'entrée par MD5.
* @param input Le texte à hacher
* @return Le hachat de l'input de MD5
*/
public static String computeMD5(String input) {
byte[] message = input.getBytes();
int messageLenBytes = message.length;
int numBlocks = ((messageLenBytes + 8) >>> 6) + 1;
int totalLen = numBlocks << 6;
byte[] paddingBytes = new byte[totalLen - messageLenBytes];
paddingBytes[0] = (byte) 0x80;
long messageLenBits = (long) messageLenBytes << 3;
ByteBuffer lengthBuffer = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(messageLenBits);
byte[] lengthBytes = lengthBuffer.array();
byte[] paddedMessage = new byte[totalLen];
System.arraycopy(message, 0, paddedMessage, 0, messageLenBytes);
System.arraycopy(paddingBytes, 0, paddedMessage, messageLenBytes, paddingBytes.length);
System.arraycopy(lengthBytes, 0, paddedMessage, totalLen - 8, 8);
int[] h = {
0x67452301,
0xefcdab89,
0x98badcfe,
0x10325476
};
int[] k = {
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
};
int[] r = {
7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21
};
for (int i = 0; i < numBlocks; i++) {
int[] w = new int[16];
for (int j = 0; j < 16; j++) {
w[j] = ByteBuffer.wrap(paddedMessage, (i << 6) + (j << 2), 4).order(ByteOrder.LITTLE_ENDIAN).getInt();
}
int a = h[0];
int b = h[1];
int c = h[2];
int d = h[3];
for (int j = 0; j < 64; j++) {
int f;
int g;
if (j < 16) {
f = (b & c) | (~b & d);
g = j;
} else if (j < 32) {
f = (d & b) | (~d & c);
g = (5 * j + 1) % 16;
} else if (j < 48) {
f = b ^ c ^ d;
g = (3 * j + 5) % 16;
} else {
f = c ^ (b | ~d);
g = (7 * j) % 16;
}
final int temp = d;
d = c;
c = b;
b = b + Integer.rotateLeft(a + f + k[j] + w[g], r[j]);
a = temp;
}
h[0] += a;
h[1] += b;
h[2] += c;
h[3] += d;
}
// Step 5: Output
ByteBuffer md5Buffer = ByteBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN);
md5Buffer.putInt(h[0]).putInt(h[1]).putInt(h[2]).putInt(h[3]);
byte[] md5Bytes = md5Buffer.array();
StringBuilder md5Hex = new StringBuilder();
for (byte b : md5Bytes) {
md5Hex.append(String.format("%02x", b));
}
return md5Hex.toString();
}
}
1.6607142857142858,1.375,1.0803571428571428,1.2678571428571428,1.0,1.0267857142857142,1.1160714285714286,1.0803571428571428,5.0,5.0,5.008928571428571,5.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
1.945945945945946,1.2972972972972974,1.2702702702702702,1.2702702702702702,1.9864864864864864,2.0,1.4054054054054055,1.1486486486486487,1.2972972972972974,1.2702702702702702,1.162162162162162,1.0675675675675675,0.13513513513513514,0.02702702702702703,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
1.3980582524271845,1.3495145631067962,2.0097087378640777,1.029126213592233,1.029126213592233,1.796116504854369,5.019417475728155,5.019417475728155,5.0,5.009708737864078,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
1.6666666666666667,1.3333333333333333,2.0,1.3333333333333333,1.6666666666666667,1.3333333333333333,3.3333333333333335,1.6666666666666667,1.3333333333333333,1.6666666666666667,1.3333333333333333,1.3333333333333333,6.333333333333333,1.3333333333333333,1.3333333333333333,1.3333333333333333,6.333333333333333,1.0,0.6666666666666666,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2.0,1.6666666666666667,5.666666666666667,3.8333333333333335,1.8333333333333333,1.3333333333333333,5.5,5.166666666666667,5.0,4.5,5.0,2.8333333333333335,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
1.5,1.1428571428571428,1.6428571428571428,1.4285714285714286,1.2142857142857142,1.1428571428571428,6.428571428571429,1.7142857142857142,1.0,1.7142857142857142,1.2142857142857142,1.1428571428571428,5.928571428571429,0.8571428571428571,0.5714285714285714,0.7857142857142857,0.2857142857142857,0.14285714285714285,0.14285714285714285,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
3.5,3.375,3.25,3.125,3.5,3.0,3.375,3.25,3.375,3.375,3.5,3.125,3.5,3.125,3.375,3.75,3.375,3.5,3.5,2.25,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
1.3333333333333333,1.4166666666666667,3.6666666666666665,4.75,5.0,5.0,5.0,5.0,5.0,1.3333333333333333,1.3333333333333333,0.5833333333333334,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
3.1666666666666665,5.166666666666667,1.5,1.1666666666666667,2.1666666666666665,5.0,3.5,5.166666666666667,1.3333333333333333,1.3333333333333333,2.5,0.5,0.16666666666666666,0.3333333333333333,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
3.8076923076923075,3.269230769230769,3.3846153846153846,4.038461538461538,4.8076923076923075,4.115384615384615,3.423076923076923,3.1153846153846154,3.8461538461538463,3.8461538461538463,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
package fr.isima.codereview;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
public class AwesomePasswordCheckerTest {
private static AwesomePasswordChecker checker;
@BeforeAll
public static void initSingleton() throws IOException {
// Le fichier de test est constitué de 2 lignes composées respectivement de 1 et de 10
URL url = AwesomePasswordChecker.class.getResource("test_file.csv");
File f = new File(url.getFile());
checker = AwesomePasswordChecker.getInstance(f);
}
@Test
public void testSingleton() throws IOException {
assertEquals(checker, AwesomePasswordChecker.getInstance());
}
@Test
void testMaskAff() {
String input = "eAi<?%éÇ42;";
int[] expected = new int[28];
int[] values = { 1, 3, 1, 6, 6, 6, 2, 4, 5, 5, 7 };
for (int i = 0; i < values.length; i++) {
expected[i] = values[i];
}
assertArrayEquals(expected, checker.maskAff(input));
}
@Test
void testDistance() {
// Le fichier de test est constitué de 2 lignes composées
// respectivement de 1 et de 10
// Si la ligne est composée de 1, puisque e vaut 1,
// on obtient une distance minimale de 0
assertEquals(0, checker.getDistance("eeeeeeeeeeeeeeeeeeeeeeeeeeee"), 0.01);
assertEquals(Math.sqrt(
// 28 caractères avec une valeur de 7
28*(10 - 7)*(10 - 7)),
checker.getDistance("****************************"), 0.01);
}
@Test
void testMD5() {
String input = "azerty";
assertEquals(AwesomePasswordChecker.computeMD5(input),
"ab4f63f9ac65152575886860dde480a1");
}
}
1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0
10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0,10.0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment