-
-
Notifications
You must be signed in to change notification settings - Fork 34.5k
bpo-31664: Add support of Blowfish in crypt. #3854
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
d1de50d
b75737a
772848c
9dbf23a
ba2f003
6a09b31
6aa4d0d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -19,15 +19,20 @@ def __repr__(self): | |
| return '<crypt.METHOD_{}>'.format(self.name) | ||
|
|
||
|
|
||
| def mksalt(method=None): | ||
| def mksalt(method=None, *, log_rounds=12): | ||
| """Generate a salt for the specified method. | ||
|
|
||
| If not specified, the strongest available method will be used. | ||
|
|
||
| """ | ||
| if method is None: | ||
| method = methods[0] | ||
| s = '${}$'.format(method.ident) if method.ident else '' | ||
| if not method.ident: | ||
| s = '' | ||
| elif method.ident[0] == '2': | ||
| s = f'${method.ident}${log_rounds:02d}$' | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What if
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I prefer to have a thin wrapper to the C crypt() function. Maybe add unit tests for invalid round values? Negative, 0, 999, etc.? |
||
| else: | ||
| s = f'${method.ident}$' | ||
| s += ''.join(_sr.choice(_saltchars) for char in range(method.salt_chars)) | ||
| return s | ||
|
|
||
|
|
@@ -48,14 +53,31 @@ def crypt(word, salt=None): | |
|
|
||
|
|
||
| # available salting/crypto methods | ||
| METHOD_CRYPT = _Method('CRYPT', None, 2, 13) | ||
| METHOD_MD5 = _Method('MD5', '1', 8, 34) | ||
| METHOD_SHA256 = _Method('SHA256', '5', 16, 63) | ||
| METHOD_SHA512 = _Method('SHA512', '6', 16, 106) | ||
|
|
||
| methods = [] | ||
| for _method in (METHOD_SHA512, METHOD_SHA256, METHOD_MD5, METHOD_CRYPT): | ||
| _result = crypt('', _method) | ||
| if _result and len(_result) == _method.total_size: | ||
| methods.append(_method) | ||
| del _result, _method | ||
|
|
||
| def _add_method(name, *args): | ||
| method = _Method(name, *args) | ||
| globals()['METHOD_' + name] = method | ||
| salt = mksalt(method, log_rounds=4) | ||
| result = crypt('', salt) | ||
| if result and len(result) == method.total_size: | ||
| methods.append(method) | ||
| return True | ||
| return False | ||
|
|
||
| _add_method('SHA512', '6', 16, 106) | ||
| _add_method('SHA256', '5', 16, 63) | ||
|
|
||
| # Choose the strongest supported version of Blowfish hashing. | ||
| # Early versions have flaws. Version 'a' fixes flaws of | ||
| # the initial implementation, 'b' fixes flaws of 'a'. | ||
| # 'y' is the same as 'b', for compatibility | ||
| # with openwall crypt_blowfish. | ||
| for _v in 'b', 'y', 'a', '': | ||
| if _add_method('BLOWFISH', '2' + _v, 22, 59 + len(_v)): | ||
| break | ||
|
|
||
| _add_method('MD5', '1', 8, 34) | ||
| _add_method('CRYPT', None, 2, 13) | ||
|
|
||
| del _v, _add_method | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| Added support for the Blowfish hashing in the crypt module. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it still the strongest now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know what is stronger, SHA or Blowfish. But since SHA methods were added in glibc when the Blowfish method already was provided by the third-party library, I suppose that at least SHA-512 is not weaker (and likely is stronger) than Blowfish.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're right. Reference for the SHA2 methods is at https://www.akkadia.org/drepper/SHA-crypt.txt