Используя Python для аутентификации против необработанного имени пользователя, хеша, соли в DB, созданном ролями/членством ASP.NET

Попробуйте этот ( Shellcheck -clean) код:

#! /bin/bash

shopt -s nullglob       # Globs that match nothing expand to nothing
shopt -s globstar       # ** matches multiple directory levels

root_webp_dir=/var/www/themes/assets/images/webp

for jpg_path in **/*.jpg ; do
    jpg_file=${jpg_path##*/}
    [[ $jpg_path == */* ]] && jpg_dir=${jpg_path%/*} || jpg_dir=.

    webp_dir=${root_webp_dir}/${jpg_dir}
    webp_path=${webp_dir}/${jpg_file%.jpg}.webp

    [[ -d $webp_dir ]] || mkdir -p -- "$webp_dir"
    cwebp -q 100 "$jpg_path" -o "$webp_path"
done

Обратите внимание, что версия cwebp, которую я использовал для тестирования (тупо), не поддерживает -- ] соглашение о завершении параметров командной строки. В противном случае команда была бы (и должна быть) cwebp -q 100 -o "$webp_path" -- "$jpg_path". Команда в коде выше может пойти не так, если какой-либо из файлов JPEG имеет путь, который начинается с -. Один из способов обойти проблему и сделать код полностью безопасным - использовать ./**/*.jpg вместо **/*.jpg в качестве шаблона для поиска файлов JPEG.

6
задан Clint Ecker 6 November 2008 в 18:14
поделиться

2 ответа

Кажется, что Python вставляет маркер порядка байтов при преобразовании строки UTF16 в двоичный файл. Массив байтов.NET не содержит BOM, таким образом, я сделал некоторый Python гетто, который превращает UTF16 в шестнадцатеричное число, удаляет первые 4 символа, затем декодирует его к двоичному файлу.

Может быть лучший способ сорвать BOM, но это работает на меня!

Вот тот, который передает:

import hashlib
from base64 import b64decode, b64encode

def utf16tobin(s):
  return s.encode('hex')[4:].decode('hex')

b64salt = "kDP0Py2QwEdJYtUX9cJABg=="
b64hash = "OJF6H4KdxFLgLu+oTDNFodCEfMA="
binsalt = b64decode(b64salt)
password_string = 'password'.encode("utf16")
password_string = utf16tobin(password_string)

m1 = hashlib.sha1()
# Pass in salt
m1.update(binsalt + password_string)
# Pass in password
# B64 encode the binary digest
if b64encode(m1.digest()) == b64hash:
    print "Logged in!"
else:
    print "Didn't match"
    print b64hash
    print b64encode(m1.digest())
8
ответ дан 16 December 2019 в 21:47
поделиться

Две мысли относительно того, что могло идти не так, как надо.

Сначала код от отражения имеет три пути:

  • Если passwordFormat 0, он возвращает пароль, как.
  • Если passwordFormat равняется 1, он создает хеш, как Ваш код Python делает.
  • Если passwordFormat - что-нибудь кроме 0, или 1 он называет это. EncryptPassword ()

Как Вы знаете, что хешируете пароль и не шифруете пароль с этим. EncryptPassword ()? Вы, возможно, должны инвертировать EncryptPassword () функция членства и копировать это. Это - то, если у Вас нет некоторой информации, которая гарантирует, что Вы хешируете пароль и не шифруете его.

Второй, если это действительно хеширует пароль, можно хотеть видеть что Кодирование. Unicode. GetBytes () функционируют возвраты для строки "пароль", поскольку можно возвращать что-то как:

0x00 0x70 0x00 0x61 0x00 0x73 0x00 0x73 0x00 0x77 0x00 0x6F 0x00 0x72 0x00 0x64

вместо:

0x70 0x61 0x73 0x73 0x77 0x6F 0x72 0x64

Я надеюсь, что это помогает.

0
ответ дан 16 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: