Question

Eh bien, aujourd'hui, je vérifiais le module hashlib en python, mais je trouve quelque chose que je ne peux toujours pas comprendre.

Dans ce module python, il y a une importation que je ne peux pas suivre. Je dit ceci:

def __get_builtin_constructor(name):
    if name in ('SHA1', 'sha1'):
        import _sha
        return _sha.new

J'ai essayé d'importer le module _sha à partir d'un shell python, mais il est semble que ce ne peut être atteint que way.My première estimation est que c'est un module C, mais je ne suis pas sûr.

Alors, dites-moi les gars, ne savez-vous où est ce module? Comment font-ils l'importer?

Était-ce utile?

La solution

En fait, le module _sha est fourni par shamodule.c et _md5 est fourni par md5module.c et md5.c et les deux ne seront construits que lorsque votre Python est pas compilé avec OpenSSL par défaut.

Vous pouvez trouver les détails dans setup.py dans votre Python Source tarball.

    if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
        # The _sha module implements the SHA1 hash algorithm.
        exts.append( Extension('_sha', ['shamodule.c']) )
        # The _md5 module implements the RSA Data Security, Inc. MD5
        # Message-Digest Algorithm, described in RFC 1321.  The
        # necessary files md5.c and md5.h are included here.
        exts.append( Extension('_md5',
                        sources = ['md5module.c', 'md5.c'],
                        depends = ['md5.h']) )

Le plus souvent, votre Python est construit avec la bibliothèque OpenSSL et dans ce cas, ces fonctions sont fournies par les bibliothèques OpenSSL lui-même.

Maintenant, si vous voulez séparément, vous pouvez construire votre Python sans OpenSSL ou mieux encore, vous pouvez construire avec option pydebug et demandez-leur.

A partir de votre Python Source tarball:

./configure --with-pydebug
make

Et là, vous allez:

>>> import _sha
[38571 refs]
>>> _sha.__file__
'/home/senthil/python/release27-maint/build/lib.linux-i686-2.7-pydebug/_sha.so'
[38573 refs]

Autres conseils

Il semble que vous l'installation de Python a compilé sha l'intérieur _haslib au lieu de _sha (les deux modules de C). De hashlib.py en python 2.6:

import _haslib:
    .....
except ImportError:
    # We don't have the _hashlib OpenSSL module?
    # use the built in legacy interfaces via a wrapper function
    new = __py_new

    # lookup the C function to use directly for the named constructors
    md5 = __get_builtin_constructor('md5')
    sha1 = __get_builtin_constructor('sha1')
    sha224 = __get_builtin_constructor('sha224')
    sha256 = __get_builtin_constructor('sha256')
    sha384 = __get_builtin_constructor('sha384')
    sha512 = __get_builtin_constructor('sha512')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top