__init__.py 文件源码

python
阅读 52 收藏 0 点赞 0 评论 0

项目:django-encrypted-id 作者: amitu 项目源码 文件源码
def decode(e, sub_key):
    if isinstance(e, basestring):
        e = bytes(e.encode("ascii"))

    try:
        padding = (3 - len(e) % 3) * b"="
        e = base64.urlsafe_b64decode(e + padding)
    except (TypeError, AttributeError, binascii.Error):
        raise EncryptedIDDecodeError()

    for key in getattr(settings, "SECRET_KEYS", [settings.SECRET_KEY]):
        iv = hashlib.sha256((key + sub_key).encode('ascii')).digest()[:16]
        cypher = AES.new(key[:32], AES.MODE_CBC, iv)
        try:
            msg = cypher.decrypt(e)
        except ValueError:
            raise EncryptedIDDecodeError()

        try:
            crc, the_id = struct.unpack(b"<IQxxxx", msg)
        except struct.error:
            raise EncryptedIDDecodeError()

        try:
            if crc != binascii.crc32(bytes(the_id)) & 0xffffffff:
                continue
        except (MemoryError, OverflowError):
            raise EncryptedIDDecodeError()

        return the_id
    raise EncryptedIDDecodeError("Failed to decrypt, CRC never matched.")
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号