Password strength estimator

Related tags

Security nbvcxz
Overview

Nbvcxz - Password strength estimator - [Build Status]

nbvcxz is java library (and standalone console program) which is heavily inspired by the work in zxcvbn.

Password strength estimation is a bit of an art and science. Strength estimation is accomplished by running a password through different algorithms looking for matches in any part of the password on: word lists (with fuzzy matching), common dates, common years, spacial patterns, repeating characters, repeating sets of characters, and alphabetic sequences.

Each of these represent ways an attacker may try to crack a password. To be vigilant, we must adapt to new methods in password cracking and implement new methods to identify passwords susceptible to each new method.

Table of Contents

Maven Central

<dependency>
    <groupId>me.gosimple</groupId>
    <artifactId>nbvcxz</artifactId>
    <version>1.5.0</version>
</dependency>

Compile

Debian based

apt-get install git
apt-get install openjdk-8-jdk
apt-get install maven
git clone https://github.com/GoSimpleLLC/nbvcxz.git
cd nbvcxz
mvn package

The project will be built, and the jar file will be placed in the target sub-directory.

Differentiating Features

  • Internationalization support for all text output by the library (for feedback, console output, etc).
    • Currently supported languages
      • English (default)
      • Afrikaans (af)
      • Dutch (nl)
      • Finnish (fi)
      • French (fr)
      • German (de)
      • Hungarian (hu)
      • Italian (it)
      • Portuguese (pt)
      • Russian (ru)
      • Spanish (es)
      • Swedish (sv)
      • Telugu (te)
      • Ukrainian (uk)
      • Chinese (zh)
  • Better match generation algorithm which will find the absolute lowest entropy combination of the matches.
  • Support for ranked and un-ranked dictionaries.
  • Dictionary matching has the ability to use Levenshtein Distance (LD) calculations to match passwords which are non-exact matches to a dictionary entry.
    • LD calculations happen on full passwords only, and have a threshold of 1/4th the length of the password.
  • Dictionaries can be customized, and custom dictionaries can be added very easily.
    • Exclusion dictionaries can also be built and tailored per-user to prevent obvious issues like using their own email or name as their password
  • Default dictionaries have excluded single character words due to many false positives
  • Additional PasswordMatchers and Matches can be implemented and configured to run without re-compiling.
  • Easy to configure how this library works through the ConfigurationBuilder.
    • You can set minimum entropy scores, locale, year patterns, custom leet tables, custom adjacency graphs, custom dictionaries, and custom password matchers.
  • Support for generating passwords and passphrases.
    • Available in the console application as well as the library.
    • One use case is for generating a "forgot password" temporary pass

Compatibility

Strict compatibility between nbvcxz and zxcvbn has not been a goal of this project. The additional features in nbvcxz which have improved accuracy are the main causes for differences with zxcvbn. There are some ways to configure nbvcxz for better compatibility though, so we will go over those configuration parameters here.

  1. Disable the Levenshtein Distance (LD) calculation. This feature was very helpful in my analysis on helping identify passwords which were only slightly different than dictionary words but were not caught with the original implementation. This feature will be sure to cause nbvcxz to produce different results than zxcvbn for a large number of passwords. Use ConfigurationBuilder setDistanceCalc(Boolean distanceCalc)

  2. Make sure both implementations are using the same dictionaries. There are additional leaked passwords in the nbvcxz dictionary compared to zxcvbn. There are also additional dictionaries included in nbvcxz that are not in zxcvbn and vice versa. Simply different choices on what lists were important to include by default. With nbvcxz you can easily change which dictionaries are used though, so it's easy to make the different implementations use the same dictionaries. Use ConfigurationBuilder setDictionaries(List dictionaries)

  3. Disable separator match types. This is a new match type which zxcvbn has no equivalent. It helps with passphrase detection and accurately scoring them, but if we are going for compatibility we need to disable it. Use ConfigurationBuilder setPasswordMatchers(List passwordMatchers)

  4. The algorithm to find the best matches is different between nbvcxz and zxcvbn, that is likely to produce slightly different results in cases where zxcvbn is unable to find the best combination of matches due to the algorithm used. There were quite a few instances I noted that brought about the change to the algorithm used by nbvcxz where there were obviously "wrong" results for entropy based on the combination of matches because it got stuck in a local minimum. This is no longer an issue with nbvcxz, but will inherently produce different results for some passwords compared to the original algorithm used by zxcvbn. In the majority of cases both algorithms are able to figure out what the lowest entropy combination of matches on the password are, so I don't see this being too big of an issue.

A Rant On Arbitrary Password Policies

Lets think up an example scenario which I expect some of you may have run into way too often. We are a company NewStartup! and we are creating the next big web application. We want to ensure our users don't choose an easily guessable password, so we implement an arbitrary policy which says a password must have: an eight character minimum and contain upper case, lower case, numbers, and special characters

Now lets see how that policy applies to two passwords which are at opposite ends of the spectrum.

Password #1: Passw0rd! - This password was chosen to get around an arbitrary policy

Password #2: 5fa83b7e1r39xfa8hmiz0 - This was randomly generated using lowercase alphanumeric

Password #1 meets all of the rules in the policy and passes with flying colors. Password #2 does not contain upper case, or special characters, and thus the policy fails this password.

Was password #1 actually more secure than password #2 by any metric? That would be a hard argument to make.

In fact, password #1 is likely to be cracked quite quickly. password is one of the top passwords in all password lists an attacker is likely to try using a rule based dictionary attack. If the attacker knows that our policy requires: eight character minimum, upper case, lower case, numbers, and special characters they will then use rules like toggle case, l33t substitution, and suffix/prefix special characters to augment their dictionary list for the attack.

It's quite likely password #1 would fall to an attacker even in a rate limited online attack.

Password #2, while not allowed by our policy, is only susceptible to a brute force attack (if a secure hashing algorithm is used).

How to use

nbvcxz can be used as a stand-alone console program, or import it as a library.

Standalone

To use as a stand-alone program, just compile, and run it by calling: java -jar nbvcxz-1.5.0.jar alt text

Library

nbvcxz can also be used as a library for password validation in java back-ends. Below is a full example of the pieces you'd need to implement within your own application.

Configure and create object
All defaults
// With all defaults...
Nbvcxz nbvcxz = new Nbvcxz();
Localization

Here we're creating a custom configuration which localizes all text to French

// Create our configuration object and set the locale
Configuration configuration = new ConfigurationBuilder()
        .setLocale(Locale.forLanguageTag("fr"))
        .createConfiguration();
        
// Create our Nbvcxz object with the configuration we built
Nbvcxz nbvcxz = new Nbvcxz(configuration);
Custom configuration

Here we're creating a custom configuration with a custom exclusion dictionary and minimum entropy

// Create a map of excluded words on a per-user basis using a hypothetical "User" object that contains this info
List<Dictionary> dictionaryList = ConfigurationBuilder.getDefaultDictionaries();
dictionaryList.add(new DictionaryBuilder()
        .setDictionaryName("exclude")
        .setExclusion(true)
        .addWord(user.getFirstName(), 0)
        .addWord(user.getLastName(), 0)
        .addWord(user.getEmail(), 0)
        .createDictionary());

// Create our configuration object and set our custom minimum
// entropy, and custom dictionary list
Configuration configuration = new ConfigurationBuilder()
        .setMinimumEntropy(40d)
        .setDictionaries(dictionaryList)
        .createConfiguration();
        
// Create our Nbvcxz object with the configuration we built
Nbvcxz nbvcxz = new Nbvcxz(configuration);
Estimate password strength
Simple
// Estimate password 
Result result = nbvcxz.estimate(password);

return result.isMinimumEntropyMet();
Feedback

This part will need to be integrated into your specific front end, and really depends on your needs. Here are some of the possibilities:

// Get formatted values for time to crack based on the values we 
// input in our configuration (we used default values in this example)
String timeToCrackOff = TimeEstimate.getTimeToCrackFormatted(result, "OFFLINE_BCRYPT_12");
String timeToCrackOn = TimeEstimate.getTimeToCrackFormatted(result, "ONLINE_THROTTLED");

// Check if the password met the minimum set within the configuration
if(result.isMinimumEntropyMet())
{
    // Start building success message
    StringBuilder successMessage = new StringBuilder();
    successMessage.append("Password has met the minimum strength requirements.");
    successMessage.append("<br>Time to crack - online: ").append(timeToCrackOn);
    successMessage.append("<br>Time to crack - offline: ").append(timeToCrackOff);    
    
    // Example "success message" that would be displayed to the user
    // This is obviously just a contrived example and would have to
    // be tailored to each front-end
    setSuccessMessage(successMessage.toString());
    return true;
}
else
{
    // Get the feedback for the result
    // This contains hints for the user on how to improve their password
    // It is localized based on locale set in configuration
    Feedback feedback = result.getFeedback();
    
    // Start building error message
    StringBuilder errorMessage = new StringBuilder();
    errorMessage.append("Password does not meet the minimum strength requirements.");
    errorMessage.append("<br>Time to crack - online: ").append(timeToCrackOn);
    errorMessage.append("<br>Time to crack - offline: ").append(timeToCrackOff);
    
    if(feedback != null)
    {
        if (feedback.getWarning() != null)
            errorMessage.append("<br>Warning: ").append(feedback.getWarning());
        for (String suggestion : feedback.getSuggestion())
        {
            errorMessage.append("<br>Suggestion: ").append(suggestion);
        }
    }
    // Example "error message" that would be displayed to the user
    // This is obviously just a contrived example and would have to
    // be tailored to each front-end
    setErrorMessage(errorMessage.toString());
    return false;
}
Generate passphrase/password

We have a passphrase/password generator as part of nbvcxz which very easy to use.

Passphrase
// Generate a passphrase from the standard (eff_large) dictionary with 5 words with a "-" between the words
String pass1 = Generator.generatePassphrase("-", 5);

// Generate a passphrase from a custom dictionary with 5 words with a "-" between the words
String pass2 = Generator.generatePassphrase(new Dictionary(...), "-", 5);
Password
// Generate a random password with alphanumeric characters that is 15 characters long
String pass = Generator.generateRandomPassword(Generator.CharacterTypes.ALPHANUMERIC, 15);

Bugs and Feedback

For bugs, questions and discussions please use the Github Issues.

License

MIT License

Requires Java

  • Java 1.7+

Application using this library

Anyone else using the library in their application, i'd love to hear and put a link up here.

Comments
  • Need more translations

    Need more translations

    I'd love to have nbvcxz translated into as many languages as possible. Currently, it's got an English and French translation. I sadly am not multilingual, so I can't really do anything here. I am hoping some users who are multilingual can take a little bit of time to translate the not terribly large amount of text into whatever languages they are able to.

    The two files which need to be translated to another language can be found here: https://github.com/GoSimpleLLC/nbvcxz/blob/master/src/main/resources/feedback.properties and here: https://github.com/GoSimpleLLC/nbvcxz/blob/master/src/main/resources/main.properties

    Edit: We have had some translations completed already, so i'll list them here. French Russian Ukrainian Afrikaans Hungarian Spanish Portuguese

    If you know the language, feel free to review each: https://github.com/GoSimpleLLC/nbvcxz/tree/master/src/main/resources

    help wanted 
    opened by Tostino 14
  • zxcvbn compatibility

    zxcvbn compatibility

    We are currently building password rating into two separate clients, one Java, one C++ and would like to use native password rating libraries.

    For Java we are already using nbvcxz, for C++ we want to use zxcvbn.

    Ideally both clients would identify the same passwords as weak. However, reading https://github.com/GoSimpleLLC/nbvcxz#differentiating-features, I'm assuming this never was a goal of nbvcxz (which I understand). What would it take to give nbvcxz a "compatability" mode that would make it produce the same (or at least almost the same) results as zxcvbn?

    As a best-effort measure: are there some configurations that would get nbvcxz results closer aligned to the zxcvbn results?

    opened by TomLottermann 9
  • Multiple simultaneous connections cause heap dump

    Multiple simultaneous connections cause heap dump

    Not sure if this is an issue or if we haven't implemented something correctly. We're trying to use the library for password validation, and we've found that 200+ simultaneous connections fill the JVM heap and crash our servers. Basically we have an API enpoint that the user calls and passes their password. When then call nbvcxz.estimate(password).

    opened by gregholliday 8
  • Add score enum indicating password strength

    Add score enum indicating password strength

    First, thank you for providing that awesome library!

    Second, I need just like zxcvbn does, an enum indicating if the password is either, worst, bad, wak, good or strong. According to zxcvbn, it's possible to do that, based on guesses:

    result.score      # Integer from 0-4 (useful for implementing a strength bar)
    
      0 # too guessable: risky password. (guesses < 10^3)
    
      1 # very guessable: protection from throttled online attacks. (guesses < 10^6)
    
      2 # somewhat guessable: protection from unthrottled online attacks. (guesses < 10^8)
    
      3 # safely unguessable: moderate protection from offline slow-hash scenario. (guesses < 10^10)
    
      4 # very unguessable: strong protection from offline slow-hash scenario. (guesses >= 10^10)
    

    This would be accessible calling getScore() in me.gosimple.nbvcxz.scoring#Result

    opened by Rapster 8
  • Define a stable automatic module name

    Define a stable automatic module name

    nbvcxz does not currently use modules. When we use it in a JDK9 modular application, Java turns the JAR into a so-called automatic module, whose name is derived from the file name. However, the default name does not follow the recommended module naming conventions (reverse-dns style, module name derived from the main exported package).

    It is possible to specify a stable automatic module name through a Automatic-Module-Name manifest entry, while still targeting JDK8:

    Automatic-Module-Name: me.gosimple.nbvcxz

    Selecting a stable module name is very important, because Java does not allow two modules to own the same package. So either provide the module name through the manifest file or event better: Provide a complete module declaration.

    opened by eckig 7
  • Add application using this library

    Add application using this library

    Hey there again, you have stated the following in the README: "Anyone else using the library in their application, i'd love to hear and put a link up here."

    I developed an android application around this library, so I would really appreaciate it if you would add my app to this list :).

    Here the link again: https://github.com/cyb3rko/pazzword

    opened by cyb3rko 5
  • L33t words not matched as expected

    L33t words not matched as expected

    L33tified words seem to get only partial dictionary matches.

    Result

    The password Ch1ck3n1970 currently yields:

    • BruteForceMatch: C
    • BruteForceMatch: h
    • BruteForceMatch: 1
    • BruteForceMatch: c
    • DictionaryMatch: ken (male_names)
    • YearMatch: 1970

    For comparison, this is Chicken1970:

    • DictionaryMatch: chicken (passwords)
    • YearMatch: 1970

    Expected

    For Ch1ck3n1970 I would expect the same matches as Chicken1970:

    • DictionaryMatch: chicken (passwords, Leet Substitutions true)
    • YearMatch: 1970
    opened by jdhoek 5
  • Dictionary word not always recognized

    Dictionary word not always recognized

    In this example I have configured nbvcxz with an additional single-entry dictionary to test how a common password occurrence (surname or given name plus a few numbers) is handled:

    // Just a random string for testing. Please assume for the sake of the example that
    // 'Gohklhiepu' is the user's surname.
    Map<String, Integer> excludeMap = new HashMap<>();
    excludeMap.put("Gohklhiepu", 0);
    
    // Just like the README.
    List<Dictionary> dictionaryList = ConfigurationBuilder.getDefaultDictionaries();
    dictionaryList.add(new Dictionary("exclude", excludeMap, true));
    
    Configuration configuration = new ConfigurationBuilder()
            .setDictionaries(dictionaryList)
            .setMinimumEntropy(30d)
            .createConfiguration();
    
    Nbvcxz nbvcxz = new Nbvcxz(configuration);
    
    
    // Test A.
    
    Result result = nbvcxz.estimate("Gohklhiepu");
    
    System.out.println(result.getEntropy());
    // 0.0
    
    for (Match match : result.getMatches()) {
        System.out.println(match.getDetails());
        // DictionaryMatch
    }
    
    
    // Test B.
    
    result = nbvcxz.estimate("Gohklhiepu3425");
    
    System.out.println(result.getEntropy());
    // 60.29210956096036
    
    for (Match match : result.getMatches()) {
        System.out.println(match.getDetails());
        // A series of BruteForceMatch
    }
    

    As expected, using the fictional dictionary word as password gives 0.0 entropy.

    Surprisingly, word + 3425 (which is a rather weak password if we assume that word is the user's surname and the number his postal code or house number) results in a rather high entropy of 60.3. It looks like the word is not recognized as a dictionary word — all matches are BruteForceMatch.

    Could this be a bug?

    opened by jdhoek 5
  • Dictionary distance

    Dictionary distance

    /u/finlay_mcwalter on reddit said:

    From the linked explanation: ...looking for matches in any part of the password on: word lists, ... I wonder if, rather than (or perhaps as well as) looking for matches in any part, it would be more productive to compute the Levenshtein distance between your various "bad passwords" and the candidate password? With that, a password of paXssXwoXrd, which has only a Levenshtein distance to password of 3, would be flagged as weak, whereas it has none of the bad characteristics you're currently looking for. Some of the daft ways people "harden" their passwords, like l33t and cASEsWappING, will produce pretty low Levenshtein statistics without the need for a dedicated matcher.

    enhancement 
    opened by Tostino 4
  • Fixing some typos on portuguese bundle

    Fixing some typos on portuguese bundle

    Portuguese is my mother language, and I found some typos on pt bundle. So I'm contributing with my changes to upstream. All words are following the last spelling reform, so I believe it will work for all countries who speaks Portuguese.

    I also changed bundle values to Unicode because the current version on master branch are printing messages like "Repetições" instead of "Repetições".

    Thank you.

    opened by garcia-jj 3
  • Can't turn off brute force matcher

    Can't turn off brute force matcher

    Hey there,

    first: nice lib, thanks for your work!

    My Problem: I would like to use your library with only my own password matchers. The problem are the BruteForceMatches or the isRandom-check. Is there a way to turn it off?

    opened by mjtic12 3
  • Too high score for special characters

    Too high score for special characters

    With the String "+=&/()!" (without quotes) nbvcxz returns a score of 4/4, entropy of around 35 and 7 brute force matches with an entropy of around 5 each. Which seems kinda overrated.

    The online demo on the other hand returns a single brute force match with only a score of 2/4. Which seems more appropriate for a password of only 7 chars. I'm sure even some precomputed rainbow tables go up to 8 normal chars (letters, digits and regular special characters)

    opened by HaasJona 0
  • StackOverflowError when generating estimate

    StackOverflowError when generating estimate

    I don't know what password caused this, but observed the following crash:

    java.lang.StackOverflowError
    	at java.base/java.util.TreeMap.getEntry(TreeMap.java:350)
    	at java.base/java.util.TreeMap.get(TreeMap.java:279)
    	at me.gosimple.nbvcxz.matching.DictionaryMatcher.replaceAtIndex(DictionaryMatcher.java:68)
    	at me.gosimple.nbvcxz.matching.DictionaryMatcher.replaceAtIndex(DictionaryMatcher.java:82)
    	at me.gosimple.nbvcxz.matching.DictionaryMatcher.replaceAtIndex(DictionaryMatcher.java:82)
    	at me.gosimple.nbvcxz.matching.DictionaryMatcher.replaceAtIndex(DictionaryMatcher.java:82)
    	<~700 more identical lines truncated>
    

    This is a condensed version of the configuration that was used:

    List<Dictionary> dictionaries = new ArrayList<>(ConfigurationBuilder.getDefaultDictionaries());
    DictionaryBuilder userDictionary = new DictionaryBuilder()
            .setDictionaryName("user_details")
            .setExclusion(true);
    
    var relatedWords = List.of("<user email and potentially other user fields>");
    
    if (relatedWords != null) {
        for (String word : relatedWords) {
            userDictionary.addWord(word, 0);
        }
    }
    
    dictionaries.add(userDictionary.createDictionary());
    dictionaries.add(new DictionaryBuilder()
        .setDictionaryName("example")
        .setExclusion(true)
        .addWord("example", 0)
        .addWord("example.com", 0)
        .createDictionary());
    
    return new ConfigurationBuilder()
            .setDictionaries(dictionaries)
            .createConfiguration();
    

    Using Nbvcxz v1.5.0.

    opened by thusoy 1
  • Too high estimates when finding words in dictionaries

    Too high estimates when finding words in dictionaries

    The way that DictionaryMatcher#match works isn't consistent, or at least one could make an argument that it isn't. It gives too high entropy to some passwords that are just "worse" l33t-substituted versions of some other password. For example

    The password "passw0rd" will be matched directly to a word found in the dictionary "passwords". In that dictionary "passw0rd" is at rank 411 so it is given an entropy of ~8.68.

    The password "p4s5w0rd" will not be matched directly to a word found in the dictionary "passwords". Instead the match-method will try to use l33t-substitutions and one of those substitutions is the word "password". That word is then looked up in the dictionaries and found at rank 2 in the "passwords" dictionary. Thus, the password is given an entropy of ~3.32.

    The "easy" fix for this might be to not short circuit the match-method with "continue" in the for-loops, but I'm not sure how that would affect other parts of the system and it will increase the running time of estimating a password.

    Note that I'm not saying that "p4s5w0rd" is more secure than "passw0rd" and should get a higher score. What I'm saying is that its estimated entropy shouldn't be lower, since both strings are essentially a l33t-substitution on the word "password" - it's just that one of the strings is a common password while the other one isn't.

    In general, if two strings can both be transformed into the same string and that transformed string has a lower entropy than either of the non-transformed strings, then both the non-transformed strings should get the entropy value of the transformed string.

    opened by per-erik 0
  • ConfigurationBuilder.getDefaultXYZ returns internal instances

    ConfigurationBuilder.getDefaultXYZ returns internal instances

    Because ConfigurationBuilder.getDefaultXYZ returns the internal instances (and because of the way the documentation suggests to add stuff to the configuration builder), one can easily add for example matchers multiple times.

    public int estimate(String password) {
        List<PasswordMatcher> matchers = ConfigurationBuilder.getDefaultPasswordMatchers();
                matchers.add(new PasswordMatcher() {
                    @Override
                    public List<Match> match(Configuration configuration, String password) {
                        System.out.println("Called with: " + password);
                        return new ArrayList<>();
                    }
                });
        Configuration config = new ConfigurationBuilder()
            .setPasswordMatchers(matchers)
            .createConfiguration();
        Nbvcxz tester = new Nbvcxz(config)
        Result result = tester.estimate(password);
        return result.getBasicScore(); // Yes I've seen that you dislike this, but just to illustrate! :)
    }
    

    Running the above once will print "Called with ...". Running it a second time will print "Called with ..." twice, a third time trice, a fourth time will print it four times and so on.

    One can get around this by either creating the configuration once (and not every time a test is made) or by wrapping the return value of ConfiguratioBuilder.getDefaultPasswordMatchers() in a new ArrayList.

    This is not a big bug but given the documentation I spent a good half hour scratching my head as to why I was getting multiple calls to my "PasswordMatcher".

    Best Regards, Per-Erik

    opened by per-erik 3
  • Implemented an

    Implemented an "unmunger"

    For issue #45

    Arbitrary string to string substitution implemented, so "P@55uu0rd" -> "password" works, as does "8u2T3RfL?" -> "butterfly" from the wikipedia page. I wrote DictionaryMatcher.testArbitraryLengthSubstitutions() to test a few more examples. leetTable has been replaced by the MungeTable class which facilitates some of the substituting. MungeTable is initialized in ConfigurationBuilder as before, you can try adding some more substitutions there, I just added the few from the wikipedia page and some extra ones that I thought up. PasswordChain is used to store the list of possible substring permutations. I rewrote translateLeet as getUnmungedVariations, and rewrote replaceAtIndex. They kind of work in the same way, just with a list of String[] instead of an in-place char array. There are some very obscure limitations, but I doubt they could be much of an issue. Efficiency wise it's probably worse than before, but I guess it depends on what your expectations are. It still takes a fraction of a second to estimate a reasonably sized password, at least.

    Also, I changed the pom.xml java version from 1.7 to 8 so I could use streams and lambdas, is that an issue?

    Let me know if you want me to do more on this, I'm sure it's not perfect. There are loads of occurrences of "leet" in comments and method names etc. that should probably be something like "munge" now...

    opened by Ronan-H 2
Releases(1.5.0)
  • 1.5.0(Aug 3, 2020)

    Release 1.5.0 brings performance improvements for edge cases, improved thread safety, reduced memory usage, and more language support.

    • Add Chinese, Finnish, and Swedish language support
    • Improve memory churn when creating a new Nbvcxz() instead of reusing the object multiple times
    • Add automatic module name
    • Can now add a collection of words to the dictionaries at once rather than word-at-a-time
    • Improve Nbvcxz thread safety
    • Update cracking speed for different algorithms to match what's available today
    Source code(tar.gz)
    Source code(zip)
    nbvcxz-1.5.0.jar(744.19 KB)
  • 1.4.3(Dec 4, 2018)

    Release 1.4.3 fixes some performance issues which could lead to extremely long estimation times, and adds some new features.

    • Add support for scaling the offline guess speeds by a hardware cost.
    • Set minimum entropy now is able to be set by passing in how much time you want an attack to take using a specific guess type.
    • There is now a getBasicScore() method on Result which emulates the zxcvbn score (0-4)
    Source code(tar.gz)
    Source code(zip)
    nbvcxz-1.4.3.jar(737.40 KB)
  • 1.4.2(Jul 20, 2018)

  • 1.4.1(Mar 24, 2018)

    Release 1.4.1 improves some translations, as well as adds support for additional languages.

    The new languages supported are:

    • Dutch (nl)
    • German (de)
    • Italian (it)
    • Telugu (te)

    Thanks again to all who contributed their help with translation.

    Other features in this release are...

    • Updated the guesses / second for offline modes to provide more accurate representation of current hardware.
    • Improvements to feedback. We now give more customized recommendations based on the analysis of the password.
    Source code(tar.gz)
    Source code(zip)
    nbvcxz-1.4.1.jar(714.47 KB)
  • 1.4.0(Mar 29, 2017)

    Release 1.4.0 contains a few user visible features, most notably of which: Nbvcxz now supports 8 languages.

    The languages supported are:

    • English (default)
    • French (fr)
    • Spanish (es)
    • Portuguese (pt)
    • Russian (ru)
    • Ukrainian (uk)
    • Afrikaans (af)
    • Hungarian (hu)

    Thanks to all who contributed their help in translating.

    Other features in this release are...

    • Default guesses/sec for offline guess types now have a Maintainer-hit-by-a-bus scaling mode.
      • In the case this library is no longer maintained (or you choose to stay on an old version of it), we will scale the existing values by Moore's law every year.
    • Feedback now returns a "result" text, letting the user know if their password met the minimum entropy or not.
    Source code(tar.gz)
    Source code(zip)
    nbvcxz-1.4.0.jar(725.65 KB)
  • 1.3.4(Feb 27, 2017)

  • 1.3.3(Feb 17, 2017)

    Release 1.3.3 - Fix for: https://github.com/GoSimpleLLC/nbvcxz/issues/7

    Exclusion dictionaries were not working as expected with partial words. They previously only matched if the value in the exclusion dictionary matched the entire password. Now they will match a portion of the password.

    For example, if we added the users last name to an exclusion dictionary: Johnson and their password was mylongjohnson, it previously wouldn't match that exclusion dictionary on the "johnson" portion of that password. Now it will (giving that portion of the password 0 bits of entropy).

    I also added a new builder class for creating custom dictionaries, because they require all lower case words within them to work properly, so we need to make an easy way for users to do so. I also updated all javadoc comments to reflect that dictionaries need to contain lower case words.

    Source code(tar.gz)
    Source code(zip)
    nbvcxz-1.3.3.jar(712.03 KB)
  • 1.3.2(Feb 9, 2017)

    Release 1.3.2 - Fix for: https://github.com/GoSimpleLLC/nbvcxz/issues/6

    Implemented a timeout for the findBestMatches algorithm which can be configured. If it exceeds the time specified, it will fallback to the findGoodEnoughMatches algorithm which is much faster, but also less likely to find the optimal match combination.

    Source code(tar.gz)
    Source code(zip)
    nbvcxz-1.3.2.jar(711.25 KB)
  • 1.3.1(Dec 23, 2016)

  • 1.3.0(Dec 23, 2016)

    Release 1.3.0 - Nbvcxz gets a passphrase and password generator.

    You are now able to generate passphrases from either the standard (eff_large) dictionary, or any user supplied dictionary, with a configurable number of words and word delimiter.

    There is also a random password generator if that's more your style. You can configure the character set to generate from, and the number of characters to generate.

    Source code(tar.gz)
    Source code(zip)
    nbvcxz-1.3.0.jar(710.72 KB)
  • 1.2.1(Dec 19, 2016)

  • 1.2.0(Dec 13, 2016)

    Version 1.2.0 contains new features, more accurate estimates, and more matching methods.

    • Added dictionary distance matching, so if a password is close to a word in any dictionary, we will do a distance calculation to find the closest match.
    • New match combination algorithm to ensure the best match combination is chosen for scoring the password.
    • Unranked dictionary support
    • New standard dictionary for the EFF wordlist: https://www.eff.org/files/2016/07/18/eff_large_wordlist.txt
    • Bug fixes (yay!)
    Source code(tar.gz)
    Source code(zip)
    nbvcxz-1.2.0.jar(705.77 KB)
  • 1.1.0(Nov 30, 2016)

Owner
GoSimple
GoSimple
Time-Based One-Time Password (RFC 6238) and HMAC-Based One-Time Password (RFC 4226) reference implementations and more.

Crypto Time-Based One-Time Password (RFC 6238) and HMAC-Based One-Time Password (RFC 4226) reference implementations and more. Getting Started TOTP ge

Oliver Yasuna 1 May 12, 2022
A small and easy-to-use one-time password generator library for Java according to RFC 4226 (HOTP) and RFC 6238 (TOTP).

OTP-Java A small and easy-to-use one-time password generator for Java according to RFC 4226 (HOTP) and RFC 6238 (TOTP). Table of Contents Features Ins

Bastiaan Jansen 106 Dec 30, 2022
evilzip lets you create a zip file(with password) that contains files with directory traversal characters in their embedded path.

evilzip logs 20210701 修改权限问题,让解压后的文件默认就有读写执行的权限。 About evilzip lets you create a zip file(with password) that contains files with directory traversal

鸭王 87 Dec 11, 2022
Trino UDFs Plugin to encrypt/decrypt values with a password

trino-encrypt-udfs Example of Trino UDFs Plugin to encrypt and decrypt values with a password. Introduction In Trino you can create new Plugins by imp

Victor Coustenoble 10 Dec 13, 2022
A small and easy-to-use one-time password generator library for Java according to RFC 4226 (HOTP) and RFC 6238 (TOTP).

OTP-Java A small and easy-to-use one-time password generator for Java according to RFC 4226 (HOTP) and RFC 6238 (TOTP). Table of Contents Features Ins

Bastiaan Jansen 106 Dec 30, 2022
A password strength test app with strength, estimated crack times, warnings and suggestions to help make better passwords.

Is Your Password Secure? A password strength test app which displays strength, estimated crack time and provides warnings and suggestions to help make

the-weird-aquarian 24 Dec 15, 2022
This is an android library to represent password strength.

PasswordStrengthView This is an android library to represent password strength. Preview How to use? Add maven to your project gradle file allprojects

null 33 Jan 3, 2022
Time-Based One-Time Password (RFC 6238) and HMAC-Based One-Time Password (RFC 4226) reference implementations and more.

Crypto Time-Based One-Time Password (RFC 6238) and HMAC-Based One-Time Password (RFC 4226) reference implementations and more. Getting Started TOTP ge

Oliver Yasuna 1 May 12, 2022
Stream summarizer and cardinality estimator.

Description A Java library for summarizing data in streams for which it is infeasible to store all events. More specifically, there are classes for es

AddThis 2.2k Dec 30, 2022
Stream summarizer and cardinality estimator.

Description A Java library for summarizing data in streams for which it is infeasible to store all events. More specifically, there are classes for es

AddThis 2.2k Dec 30, 2022
This app displays the perceived strength of a single earthquake event based on the DYFI indicator.

This app displays the perceived strength of a single earthquake event based on the DYFI indicator. Used in a Udacity course in the Android Basics Nanodegree.

Ezaz Ahammad 1 Jan 23, 2022
A small and easy-to-use one-time password generator library for Java according to RFC 4226 (HOTP) and RFC 6238 (TOTP).

OTP-Java A small and easy-to-use one-time password generator for Java according to RFC 4226 (HOTP) and RFC 6238 (TOTP). Table of Contents Features Ins

Bastiaan Jansen 106 Dec 30, 2022
evilzip lets you create a zip file(with password) that contains files with directory traversal characters in their embedded path.

evilzip logs 20210701 修改权限问题,让解压后的文件默认就有读写执行的权限。 About evilzip lets you create a zip file(with password) that contains files with directory traversal

鸭王 87 Dec 11, 2022
Trino UDFs Plugin to encrypt/decrypt values with a password

trino-encrypt-udfs Example of Trino UDFs Plugin to encrypt and decrypt values with a password. Introduction In Trino you can create new Plugins by imp

Victor Coustenoble 10 Dec 13, 2022
Simple yet effective password manager.

Password Manager By Edric Antoine This application provides a convenient way to store usernames and passwords for sites you visit. It will include fun

null 1 Jan 5, 2022
A small and easy-to-use one-time password generator library for Java according to RFC 4226 (HOTP) and RFC 6238 (TOTP).

OTP-Java A small and easy-to-use one-time password generator for Java according to RFC 4226 (HOTP) and RFC 6238 (TOTP). Table of Contents Features Ins

Bastiaan Jansen 106 Dec 30, 2022