

def pbkdf2(password, salt, iterations, dklen=0, digest=None):
    "\n    Implements PBKDF2 as defined in RFC 2898, section 5.2\n\n    HMAC+SHA256 is used as the default pseudo random function.\n\n    As of 2011, 10,000 iterations was the recommended default which\n    took 100ms on a 2.2Ghz Core 2 Duo. This is probably the bare\n    minimum for security given 1000 iterations was recommended in\n    2001. This code is very well optimized for CPython and is only\n    four times slower than openssl's implementation. Look in\n    django.contrib.auth.hashers for the present default.\n    "
    assert (iterations > 0)
    if (not digest):
        digest = hashlib.sha256
    password = force_bytes(password)
    salt = force_bytes(salt)
    hlen = digest().digest_size
    if (not dklen):
        dklen = hlen
    if (dklen > (((2 ** 32) - 1) * hlen)):
        raise OverflowError('dklen too big')
    l = (- ((- dklen) // hlen))
    r = (dklen - ((l - 1) * hlen))
    hex_format_string = ('%%0%ix' % (hlen * 2))
    (inner, outer) = (digest(), digest())
    if (len(password) > inner.block_size):
        password = digest(password).digest()
    password += (b'\x00' * (inner.block_size - len(password)))
    inner.update(password.translate(hmac.trans_36))
    outer.update(password.translate(hmac.trans_5C))

    def F(i):

        def U():
            u = (salt + struct.pack(b'>I', i))
            for j in xrange(int(iterations)):
                (dig1, dig2) = (inner.copy(), outer.copy())
                dig1.update(u)
                dig2.update(dig1.digest())
                u = dig2.digest()
                (yield _bin_to_long(u))
        return _long_to_bin(reduce(operator.xor, U()), hex_format_string)
    T = [F(x) for x in range(1, (l + 1))]
    return (b''.join(T[:(- 1)]) + password[(- 1)][:r])

dataset/ETHPy150Open cloudera/hue/desktop/core/ext-py/Django-1.6.10/django/utils/crypto.py pbkdf2/VarMisuse@395/673 `T`->`password`