Аутентификация Python API

Параметр ?shallow=true в Firebase Database 2.x доступен только в REST API. См. https://www.firebase.com/docs/rest/guide/retrieving-data.html#section-rest-uri-params .

В новой базе данных Firebase 3.x, тот же параметр все еще доступен только в REST API. См. https://firebase.google.com/docs/database/rest/retrieve-data#shallow

Вы используете Firebase SDK (JavaScript от внешнего вида ), которые никогда не поддерживали этот параметр.

Дополнительные вопросы, которые обсуждались в прошлом, см .:

6
задан Vertexwahn 4 March 2016 в 16:04
поделиться

5 ответов

Рассматривайте следующее как псевдокод..

try:
    from hashlib import sha as hasher
except ImportError:
    # You could probably exclude the try/except bit,
    # but older Python distros dont have hashlib.
    try:
        import sha as hasher
    except ImportError:
        import md5 as hasher


def hash_password(password):
    """Returns the hashed version of a string
    """
    return hasher.new( str(password) ).hexdigest()

def load_auth_file(path):
    """Loads a comma-seperated file.
    Important: make sure the username
    doesn't contain any commas!
    """
    # Open the file, or return an empty auth list.
    try:
        f = open(path)
    except IOError:
        print "Warning: auth file not found"
        return {}

    ret = {}
    for line in f.readlines():
        split_line = line.split(",")
        if len(split_line) > 2:
            print "Warning: Malformed line:"
            print split_line
            continue # skip it..
        else:
            username, password = split_line
            ret[username] = password
        #end if
    #end for
    return ret

def main():
    auth_file = "/home/blah/.myauth.txt"
    u = raw_input("Username:")
    p = raw_input("Password:") # getpass is probably better..
    if auth_file.has_key(u.strip()):
        if auth_file[u] == hash_password(p):
            # The hash matches the stored one
            print "Welcome, sir!"

Вместо того, чтобы использовать разделенный от запятой файл, я рекомендовал бы использовать SQLite3 (который мог использоваться для других настроек и такого.

Кроме того, помните, что это не очень безопасно - если приложение локально, злые пользователи могли бы, вероятно, просто заменить ~/.myauth.txt файл.. Автор локального приложения является трудным преуспеть. Необходимо будет зашифровать любые данные, они читают использование пользовательского пароля, и обычно быть очень осторожными.

0
ответ дан 8 December 2019 в 18:44
поделиться

Я думаю, что необходимо сделать собственный метод аутентификации, как можно заставить его соответствовать приложению лучше всего, но пользоваться библиотекой для шифрования, такого как pycrypto или некоторая другая более легкая библиотека.

btw при необходимости в двоичных файлах окон для pycrypto, можно получить их здесь

3
ответ дан 8 December 2019 в 18:44
поделиться

Если Вы хотите простой, то используйте словарь, где ключи являются именами пользователей, и значения являются паролями (зашифрованный с чем-то как SHA256). Засолите его к/от диску (поскольку это - настольное приложение, я принимаю издержки хранения, это в памяти будет незначительно).

Например:

import pickle
import hashlib

# Load from disk
pwd_file = "mypasswords"
if os.path.exists(pwd_file):
    pwds = pickle.load(open(pwd_file, "rb"))
else:
    pwds = {}

# Save to disk
pickle.dump(pwds, open(pwd_file, "wb"))

# Add password
pwds[username] = hashlib.sha256(password).hexdigest()

# Check password
if pwds[username] = hashlib.sha256(password).hexdigest():
   print "Good"
else:
   print "No match"

Обратите внимание, что это хранит пароли как хеш - таким образом, они чрезвычайно неисправимы. При потере пароля Вы выделить новый, не вернуть старый.

0
ответ дан 8 December 2019 в 18:44
поделиться

dbr сказан:

def hash_password(password):
    """Returns the hashed version of a string
    """
    return hasher.new( str(password) ).hexdigest()

Это - действительно небезопасный способ хешировать пароли. Вы не хотите делать это. Если Вы хотите знать, почему прочитанный Газета Bycrypt парней, которые сделали систему хеширования пароля для OpenBSD. Дополнительно, если хотят хорошее обсуждение того, как пароли повреждаются, проверяют это интервью с автором Джека Потрошителя (популярный взломщик пароля UNIX).

Теперь B-склеп является большим, но я должен признать, что не использую эту систему, потому что я не имел алгоритм EKS-шифра в наличии и не хотел реализовывать его мой сам. Я использую немного обновленную версию системы FreeBSD, которую я отправлю ниже. Суть - это. Только хешируйте пароль. Посолите пароль, затем хешируют пароль и повторяются приблизительно 10,000 раз.

Если это не имело смысла, вот код:

#note I am using the Python Cryptography Toolkit
from Crypto.Hash import SHA256

HASH_REPS = 50000

def __saltedhash(string, salt):
    sha256 = SHA256.new()
    sha256.update(string)
    sha256.update(salt)
    for x in xrange(HASH_REPS): 
        sha256.update(sha256.digest())
        if x % 10: sha256.update(salt)
    return sha256

def saltedhash_bin(string, salt):
    """returns the hash in binary format"""
    return __saltedhash(string, salt).digest()

def saltedhash_hex(string, salt):
    """returns the hash in hex format"""
    return __saltedhash(string, salt).hexdigest()

Для развертывания системы как это ключевой вещью рассмотреть является константа HASH_REPS. Это - масштабируемый фактор стоимости в этой системе. Необходимо будет сделать тестирование для определения то, что является exceptable количеством времени, Вы хотите ожидать каждого хеша, который будет вычислен по сравнению с риском офлайнового основанного на словаре нападения на Ваш файл паролей.

Безопасность трудна, и методика, которую я представляю, не является лучшим способом сделать это, но это значительно лучше, чем простой хеш. Дополнительно это очень просто для реализации. Таким образом, даже Вы не выбираете более сложное решение, это не хуже там.

надежда это помогает, Tim

11
ответ дан 8 December 2019 в 18:44
поделиться
import hashlib
import random

def gen_salt():
    salt_seed = str(random.getrandbits(128))
    salt = hashlib.sha256(salt_seed).hexdigest()
    return salt

def hash_password(password, salt):
    h = hashlib.sha256()
    h.update(salt)
    h.update(password)
    return h.hexdigest()

#in datastore
password_stored_hash = "41e2282a9c18a6c051a0636d369ad2d4727f8c70f7ddeebd11e6f49d9e6ba13c"
salt_stored = "fcc64c0c2bc30156f79c9bdcabfadcd71030775823cb993f11a4e6b01f9632c3"

password_supplied = 'password'

password_supplied_hash = hash_password(password_supplied, salt_stored)
authenticated = (password_supplied_hash == password_stored_hash)
print authenticated #True

see also gae-authenticate-to-a-3rd-party-site

0
ответ дан 8 December 2019 в 18:44
поделиться
Другие вопросы по тегам:

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