Ocal moje sekrety!

14

Mam tak wiele tajemnic i nigdzie ich nie trzymam!

Cel jest prosty: napisać program, który pozwala zapisać ciąg znaków i zabezpieczyć go hasłem.

Program przyjmie alias, hasło i (opcjonalnie) sekret jako parametry.

Jeśli program jest wywoływany po raz pierwszy z danym aliasem, zapisze / zapamięta sekret i wyśle ​​wszystko, co chcesz.

Jeśli program zostanie wywołany z aliasem, który był wcześniej używany, to wyśle ​​sekret dla tego aliasu, jeśli hasło jest takie samo jak przy pierwszym uruchomieniu programu z tym aliasem.

Inne przypadki

  • Jeśli po raz pierwszy zostanie wywołany z pewnym aliasem i nie zostanie podany żaden sekret - nic nie przechowuj.

  • Jeśli program jest wywoływany z użytym aliasem, a hasło jest niepoprawne - zwróć dowolny błąd lub nic.

  • Jeśli program zostanie wywołany z aliasem, który został użyty, hasło jest poprawne i dostarczony jest nowy klucz tajny - wypisz stary klucz tajny i zastąp go nowym, aby następnym razem był wyświetlany tylko nowy klucz tajny.

  • Jeśli program zostanie wywołany z aliasem, który został użyty, hasło jest prawidłowe i nie zostanie podany żaden nowy klucz tajny - wypisz stary klucz tajny i upewnij się, że nie zostanie zastąpiony.

Uwaga: Te tajemnice / hasła nie muszą być bezpiecznie przechowywane

Uwaga: wszelkie dane alfanumeryczne dla haseł aliasów i tajemnic powinny być akceptowane

Obowiązują standardowe zasady, powodzenia!

Quinn
źródło
1
Tak, używaj czegokolwiek do przechowywania - jak w przypadku aliasów, myślę, że powinien akceptować wszelkie dane alfanumeryczne
Quinn
1
Czy możemy użyć funkcji zamiast pełnego programu?
Arnauld
1
@Arnauld Pozwolę na to
Quinn
1
Czy możemy założyć, że hasło i klucz tajny nie są pustym ciągiem?
xnor
1
Czy możemy podać odpowiedź zerową (na przykład 0 lub Brak) w dowolnej sytuacji, w której nie ujawniamy sekretu?
xnor

Odpowiedzi:

10

JavaScript (ES6),  60  50 bajtów

Zaoszczędź 10 bajtów dzięki @JonasWilms !

Staje się jako wkład albo (alias,password,secret)czy(alias,password) . Zwraca niezdefiniowany przy pierwszym przechowywaniu tajnego klucza lub fałsz, jeśli hasło jest niepoprawne.

f=(a,p,s,[P,v]=f[a]||[p])=>p==P&&(f[a]=[P,s||v],v)

Wypróbuj 1. przypadek testowy online!

Wypróbuj drugi przypadek testowy online!

W jaki sposób?

fa którego bazowy obiekt jest także używany do przechowywania haseł i tajemnice.

Skomentował

f = (             // f = named function whose underlying object is used for storage
  a,              // a = alias
  p,              // p = password
  s,              // s = optional secret
  [P, v] = f[a]   // if f[a] is defined, retrieve the password P and the secret v
           || [p] // otherwise, copy p in P
) =>              //
  p == P && (     // if p is not equal to P, yield false; else:
    f[a] = [      //   update f[a]:
      P,          //     save the new password (or leave it unchanged)
      s || v      //     save the new secret if it's defined, or keep the previous one
    ],            //
    v             //   return the previous secret
  )               //
Arnauld
źródło
Zajęło mi sekundę, aby zauważyć, jak przechowujesz rzeczy!
Kudłaty
hmm, czy to prawda?
ngn
1
@ngn To najprawdopodobniej niepoprawne. Dziękujemy za zgłoszenie tego. Powinien zostać teraz naprawiony.
Arnauld
-7 bajtów poprzez przechowywanie tablicy [hasło, wartość] wewnątrz obiektu.
Jonas Wilms
@JonasWilms Ładnie zrobione! Nie mogę wymyślić żadnej sytuacji, w której p&&jest to wymagane. To kolejne 3 bajty.
Arnauld,
6

Python 2 , 94 93 bajty

def f(a,p,s=0,d={}):
 q,t=d.get(a,(0,0))
 if q==p:d[a]=p,s or t;return t
 elif q<1<s:d[a]=p,s

Wypróbuj online!

Tym razem dziwny domyślny parametr dict Pythona działa na moją korzyść ...

Chas Brown
źródło
Zaraz, użycie domyślnego argumentu powoduje, że jest to tylko jeden obiekt zamiast nowego w wywołaniu funkcji? Hmmm ... To wyjaśnia wiele debugowania, które musiałem zrobić wcześniej LOL.
HyperNeutrino,
3

Rubin , 64 bajty

Tworzy skrót dla aliasów do pojedynczej pary kluczy password => secret . Prawdopodobnie może być bardziej elegancki.

->a,w,s=p{@q||={};(b=@q[a])?s&&b[w]?b[w]=s:b[w]:s&&@q[a]={w=>s}}

Wypróbuj online!

Wartość tuszu
źródło