{ "info": { "author": "Philip J Grabner, Cadit Health Inc", "author_email": "oss@cadit.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 1 - Planning", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "License :: Public Domain", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python" ], "description": "=======================\nPassword Strength Meter\n=======================\n\nA configurable, extensible password strength measuring library.\n\n\nProject\n=======\n\n* Homepage: https://github.com/cadithealth/passwordmeter\n* Bugs: https://github.com/cadithealth/passwordmeter/issues\n\n\nTL;DR\n=====\n\nInstall:\n\n.. code-block:: bash\n\n $ pip install passwordmeter\n\nUse from within an application with the default factors:\n\n.. code-block:: python\n\n import passwordmeter\n\n strength, improvements = passwordmeter.test(sys.argv[1])\n\n if strength < 0.5:\n print 'Your password is too weak.'\n\nUse on the command line:\n\n.. code-block:: bash\n\n $ pwm 'password'\n Password strength: 0.132549901057 (Extremely weak)\n Possible improvements:\n - Use a good mix of numbers, letters, and symbols\n - Avoid using one of the ten thousand most common passwords\n - Use a good mix of UPPER case and lower case letters\n\n\nOverview\n========\n\nThe main function provided by the `passwordmeter` package is the\n``Meter.test()`` method, which returns a tuple of (float, dict). The\nfloat is the strength of the password in the range 0 to 1 (inclusive),\nwhere 0 is extremely weak and 1 is extremely strong. The second\nparameter, which may be ``None``, is a dictionary of ways the password\ncould be improved. The keys of the dict are general \"categories\" of\nways to improve the password (e.g. \"length\") that are fixed strings,\nand the values are internationalizable strings that are human-friendly\ndescriptions and possibly tailored to the specific password.\n\nA password's strength is determined by doing a weighted, skewed,\ncurved average of a set of \"factors\". The `Meter` constructor takes a\n`settings` dictionary that configures, customizes, and/or supplements\nthe default set of factors.\n\nThe `passwordmeter.test` is a helper function that simply uses the\ndefault settings to test the strength of a password, and is\neffectively a shorthand for ``Meter().test(...)``.\n\nFor example, to use a custom selection of factors:\n\n.. code-block:: python\n\n import passwordmeter\n\n # use only the 'length' and 'charmix' factors\n meter = passwordmeter.Meter(settings=dict(factors='length,charmix'))\n\n strength, improvements = meter.test('s3cr3t p4ssW0RD!')\n\n\nSettings\n========\n\nThe `settings` attribute to the `Meter` constructor is a dictionary\nwith the following keys:\n\n* ``factors``:\n\n This is a comma-separated list of factors to use in calculating the\n strength of a password. Each element in the list is either the name\n of a known factor or a symbol-spec as defined by the `asset module\n `_. See\n ``passwordmeter.DEFAULT_FACTORS`` for the default list of factors\n (and their names).\n\n For example, to use only the 'length' factor and a custom factor:\n\n .. code-block:: python\n\n import passwordmeter\n\n class SillyFactor(passwordmeter.Factor):\n category = 'silly'\n def test(self, value, extra):\n if value == 'silly':\n return (0, 'That is a silly password!')\n return (1, None)\n\n meter = passwordmeter.Meter(\n settings=dict(factors=['length', SillyFactor]))\n\n # or, same thing, but using an asset-spec:\n\n meter = passwordmeter.Meter(\n settings=dict(factors='length,mypackage.SillyFactor'))\n\n* ``factor.{NAME}.{ATTRIBUTE}``:\n\n Set a factor's attribute during initialization. If a setting in the\n form ``factor.{NAME}.class`` is specified for a factor not listed in\n the `factors` setting, the factor will be auto-added to the list of\n factors. This is the preferred mechanism to add a custom factor to\n the default list.\n\n The following attributes are \"special\" (all are optional):\n\n =========================== ================================================\n Attribute Interpretation\n =========================== ================================================\n ``factor.{NAME}.class`` Specifies the asset-spec for the factory that\n can generate a Factor of this type.\n ``factor.{NAME}.weight`` Specifies the relative weight of this factor\n (default: 1).\n ``factor.{NAME}.skew`` Adds the specified amount to factor score\n (default: 0).\n ``factor.{NAME}.spread`` Multiplies the factor score by the specified\n amount -- similar to `weight`, but is applied\n before clipping (default: 1).\n ``factor.{NAME}.clipmin`` Force a minimum score for this factor\n (default: 0).\n ``factor.{NAME}.clipmax`` Force a maximum score for this factor\n (default: 1.3).\n ``factor.{NAME}.category`` Override the default improvement category.\n =========================== ================================================\n\n The following example settings in an INI file will give the `length`\n factor additional weight as well as adding the \"mypkg.MyFactor\"\n custom factor (initialized with the parameter `msg` set to\n ``'abort'``) to the meter's list:\n\n .. code-block:: ini\n\n factor.length.weight = 2.5\n factor.cust.class = mypkg.MyFactor\n factor.cust.msg = abort\n\n* ``pessimism``:\n\n The password strength engine weights low scores higher than high\n scores. The degree to which the engine weights low scores is set by\n the `pessimism` setting, which defaults to 10 -- the higher, the\n more a low score will pull the average score down. For example, with\n the default pessimism of 10, the two scores 0.75 and 0.25 will be\n averaged to 0.4 (instead of the true average of 0.5).\n\n* ``threshold``:\n\n Specifies the maximum score for which improvement messages should be\n returned. If not specified, all possible improvements will be\n returned, even if the relevant factor returned a perfect score (1.0\n or greater).\n\n\nCustom Factors\n==============\n\nA custom factor should subclass `passwordmeter.Factor`, implement the\n`test` method, and have a unique `category` (string) attribute.\n\nThe `test` method takes two parameters: the `value` to be tested, and\nan opaque `extra` parameter that is supplied by the calling\napplication (and can be ignored if not needed). It should return a\ntuple of (float, str).\n\nThe first element (float) of the return tuple must be greater or equal\nto zero. Although it should generally not be greater than 1.0, a\nfactor *may* return a greater value: this is used to artificially\nboost the strength of the total outcome relative to the other factors\nif applicable. Note, however, that the Meter class will always clip\nthe final outcome to the inclusive range [0, 1].\n\nThe second element of the return tuple should be a string, which is a\ndescription of how to improve the provided password. This string can\nbe ``None`` if no known way exists to improve this password for this\nspecific factor. Note that Meter class will associate this description\nwith the factor's category in the final outcome.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/cadithealth/passwordmeter", "keywords": "password strength checker meter", "license": "MIT (http://opensource.org/licenses/MIT)", "maintainer": null, "maintainer_email": null, "name": "passwordmeter", "package_url": "https://pypi.org/project/passwordmeter/", "platform": "any", "project_url": "https://pypi.org/project/passwordmeter/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/cadithealth/passwordmeter" }, "release_url": "https://pypi.org/project/passwordmeter/0.1.8/", "requires_dist": null, "requires_python": null, "summary": "A password strength measuring library.", "version": "0.1.8" }, "last_serial": 1748112, "releases": { "0.0.1": [], "0.1.0": [ { "comment_text": "", "digests": { "md5": "20bb1e7cec47044a3a62d01ddf02784f", "sha256": "02c66955f60280a6fb0bcb9fe8e8b7c7b4b4f43c00c53b2b5b72ede5d70d40a8" }, "downloads": -1, "filename": "passwordmeter-0.1.0.tar.gz", "has_sig": false, "md5_digest": "20bb1e7cec47044a3a62d01ddf02784f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46750, "upload_time": "2013-10-31T15:28:17", "url": "https://files.pythonhosted.org/packages/4b/90/e71444b33ed5898796398912d1082c17e85822baed9049ba5836f8e5dd07/passwordmeter-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "edd23d9e38ee1d1c460e76a2bc7eacba", "sha256": "9afe35d42c198174f7d3b27b5b997fb86b18525989d5857bf6653034b7eed351" }, "downloads": -1, "filename": "passwordmeter-0.1.1.tar.gz", "has_sig": false, "md5_digest": "edd23d9e38ee1d1c460e76a2bc7eacba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46768, "upload_time": "2013-10-31T15:49:22", "url": "https://files.pythonhosted.org/packages/4e/e3/4b349105e4b9b583543cb7de218dc6ec7fac9218101926b90578beda3eed/passwordmeter-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "4e3ceee6ad6370fd19389cc6de8ef216", "sha256": "cc0f186046a6dfae158f08e23b00b30955d7e8bc9bdb8c080a78d5fe4008df1e" }, "downloads": -1, "filename": "passwordmeter-0.1.2.tar.gz", "has_sig": false, "md5_digest": "4e3ceee6ad6370fd19389cc6de8ef216", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47519, "upload_time": "2013-10-31T18:36:06", "url": "https://files.pythonhosted.org/packages/ec/76/244c9a8dec7dc757cad2da8acbbc185e3f60d0b49a7eed4d463a66435f23/passwordmeter-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "aa6ceec7d6c9ff76d670a3be9623ddfe", "sha256": "d449ea4270e95cc854f491198f8529d1d830d105e54a79e67e27fa7828282f84" }, "downloads": -1, "filename": "passwordmeter-0.1.3.tar.gz", "has_sig": false, "md5_digest": "aa6ceec7d6c9ff76d670a3be9623ddfe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48528, "upload_time": "2013-10-31T19:38:37", "url": "https://files.pythonhosted.org/packages/2c/3c/960684193f22821b4fe7ab56f47b43d4b618ceddaba8403b15ecc2b851b0/passwordmeter-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "c823ea1e4ac77b72ebfa2d2880106660", "sha256": "e1f8742b0dfdfc79ddbc87928512dce5212d564364c0d22bf3c05d4c75787f74" }, "downloads": -1, "filename": "passwordmeter-0.1.4.tar.gz", "has_sig": false, "md5_digest": "c823ea1e4ac77b72ebfa2d2880106660", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48532, "upload_time": "2013-10-31T19:53:53", "url": "https://files.pythonhosted.org/packages/bc/bf/94c3b425dfdb238d2f380b1b06bc5764c22d8fb5ad846bdbcf2f4277a6d0/passwordmeter-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "39f148143c3840d398940707d3d91517", "sha256": "de5a3be301a14ddc68351179ce79de816a10d525dc6daffbf728331ee4f1c55d" }, "downloads": -1, "filename": "passwordmeter-0.1.5.tar.gz", "has_sig": false, "md5_digest": "39f148143c3840d398940707d3d91517", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48529, "upload_time": "2013-10-31T20:19:31", "url": "https://files.pythonhosted.org/packages/71/47/2a99f274ae1257dc1f59173ce09481f6d272eddeffeca9807ef479d711aa/passwordmeter-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "02ec9b87b3cfe0f00e48af91b35b167c", "sha256": "7feab79981f1268e141e740cfb4f5728eb5fa211d08f948c5bdebf1f9b8d6ec8" }, "downloads": -1, "filename": "passwordmeter-0.1.6.tar.gz", "has_sig": false, "md5_digest": "02ec9b87b3cfe0f00e48af91b35b167c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51071, "upload_time": "2015-04-04T20:36:30", "url": "https://files.pythonhosted.org/packages/72/c5/88aa5a3c473cc1054d57575278042064fc6535e24e6d2b0c9d6c35a19e0a/passwordmeter-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "33c1106217d257e118bf0a99592cb45f", "sha256": "7342315ea145cc22c5403c93f59e6b87c3643767646ad86039c7e2a2000eeace" }, "downloads": -1, "filename": "passwordmeter-0.1.7.tar.gz", "has_sig": false, "md5_digest": "33c1106217d257e118bf0a99592cb45f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51122, "upload_time": "2015-04-04T20:41:53", "url": "https://files.pythonhosted.org/packages/ac/4d/66a34b1222431a95ce9df1ee1046f1b8e3dbb456c283bd889fc338e7eb66/passwordmeter-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "e58b4a7934fcf5f0aa5d41e5a109aaec", "sha256": "f4f7df54182072a137bca3e396f2dad354770ba596dd41f6646cd1f0665fee12" }, "downloads": -1, "filename": "passwordmeter-0.1.8.tar.gz", "has_sig": false, "md5_digest": "e58b4a7934fcf5f0aa5d41e5a109aaec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51904, "upload_time": "2015-10-01T23:19:58", "url": "https://files.pythonhosted.org/packages/87/d2/f26c809d2592b94be0767a8403f5ed4a3d238fbd4c8f14b60306d33d5f8f/passwordmeter-0.1.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e58b4a7934fcf5f0aa5d41e5a109aaec", "sha256": "f4f7df54182072a137bca3e396f2dad354770ba596dd41f6646cd1f0665fee12" }, "downloads": -1, "filename": "passwordmeter-0.1.8.tar.gz", "has_sig": false, "md5_digest": "e58b4a7934fcf5f0aa5d41e5a109aaec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51904, "upload_time": "2015-10-01T23:19:58", "url": "https://files.pythonhosted.org/packages/87/d2/f26c809d2592b94be0767a8403f5ed4a3d238fbd4c8f14b60306d33d5f8f/passwordmeter-0.1.8.tar.gz" } ] }