Генерирайте солен хеш в терминала

Искам да направя AppleScript, който генерира солен хеш с терминал. Има ли конкретна терминална команда, която може да генерира осолен хеш, за предпочитане защитен като SHA-512? Ако е възможно, бих искал такъв, който е едноредов, за да мога да го използвам с командата do shell script. Търсих в мрежата, но не намерих начин да генерирам осолен хеш в терминала, а само обикновен.

Работя с OS X Mavericks 10.9.5.


person Community    schedule 13.05.2015    source източник
comment
@GeorgeNetu: За да получите SHA-512 кодиране на OSX, от openssl v0.9.8, трябва да използвате openssl dgst -sha512 (openssl sha512 работи само в по-късни версии, като v1.0.1f на Ubuntu 14.04). Това означава, че трябва да използвате командата dgst с алгоритъма SHA като опция. openssl обаче няма да помогне с генерирането на соли.   -  person mklement0    schedule 20.05.2015


Отговори (1)


Доколкото разбирам, поне концептуално, това, което искате, изисква 2 стъпки:

  • Получете произволна стойност на солта.
  • Свържете солената стойност с въведения текст (парола) и изчислете хеша за комбинираната стойност.

За по-късна проверка ще трябва да съхранявате солта заедно с получения хеш.

Следните манипулатори на AppleScript обгръщат функциите на обвивката, които осигуряват необходимата функционалност - те са предшествани от примерни извиквания.

Отказ от отговорност: моето разбиране за тази област е ограничено, така че приемайте тези функции със зърно сол (ха!).

Функцията за генериране на сол беше благодарно адаптирана от тази публикация.

# Sample text to hash.
set passwd to "somePassword"

# Generate salt value with 10 chars, amounting to about a 64-bit value.
set salt to generateSalt(10)

# Compute hash from combined salt and input value.
set hash to getSha512(salt & passwd)


# SYNOPSIS
#   getSha512(text)
# DESCRIPTION
#   Calculates and outputs TEXT's hash value using the SHA-512 (SHA-2) algorithm.
#   Output is a 128-characters string composed of lowercase hexadecimal digits.
#   To create a salted hash, obtain a salt with generateSalt() first and
#   prepend it to the text to hash.
# PREREQUISITES
#   Requires either the sha512sum or the shasum utility. One or the other should be
#   available on BSD/OSX and Linux systems.
# EXAMPLE
#   set salt to generateSalt(20)
#   set hash to getSha512(salt & passwd)
on getSha512(txt)
    do shell script "
getSha512() {
  local -a shaCmd
  if command -v sha512sum &>/dev/null; then
    shaCmd=( sha512sum )
  elif command -v shasum  &>/dev/null; then
    shaCmd=( shasum -a 512 )
  else
    { echo 'ERROR: Cannot locate SHA-512-generating utility.' >&2; return 1; }
  fi
  # Invoke the SHA-generating command and output the first space-separated field.
  # (The subsequent fields indicate the mode and input filename.)
  \"${shaCmd[@]}\" <<<\"$1\" | cut -d' ' -f1
  return \"${PIPESTATUS[0]}\"
}
getSha512 " & quoted form of txt
end getSha512

# SYNOPSIS
#   generateSalt(numChars)
# DESCRIPTION
#   Generates NUMCHARS random *printable* ASCII characters that can serve as 
#   cryptographic salt. Due to the range of printable characters, each character
#   returned contains ca. 6.55 bits of information.
#   Thus, for instance, to get a 64-bit salt value, specify 10 for NUMCHARS.
#   For a 128-bit value, specify 20.
#   Use /dev/urandom as the source of random data.
# PREREQUISITES
#   File /dev/urandom as a source of random bytes.
#   The `head` utility must support the -c option to extract a number of *bytes*.
#   Both BSD/OSX and Linux systems fulfill these requirements.
# EXAMPLE
#   set salt to generateSalt(20) # get a ca. 128-bit salt value as 20 printable ASCII chars.
on generateSalt(numChars)
    do shell script "
generateSalt() {
  [[ -c /dev/urandom ]] || { echo 'ERROR: Random source /dev/urandom not available.' >&2; return 1; }
  LC_ALL=C tr -cd '!\"#$%&'\\''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~' < /dev/urandom | head -c $1
}
generateSalt " & numChars
end generateSalt
person mklement0    schedule 14.05.2015
comment
Дали и това ще свърши работа? set passCode to "123456", set salt to random number from 10000000 to 99999999 (това е солта) set passAndSalt to passCode & salt, do shell script "echo " & passAndSalt & " | shasum -a 512 | 'awk {print $1}' - person ; 17.05.2015
comment
Ще работи (с изключение на правописна грешка: последната команда трябва да бъде do shell script "echo " & passAndSalt & " | shasum -a 512 | awk '{print $1}'"), но имайте предвид, че вашата сол е ограничена до 90 милиона възможности, което се равнява на по-малко от 27 бита произволност, докато препоръчителният минимум е 64 бита. Моята функция ви дава повече произволност на байт и не е ограничена от обхвата, който реалните числа на AppleScript могат да поемат. По този начин, със същия брой байтове (8), моята функция ви дава приблизително два пъти броя на битовете, а използването на 10 байта ще ви даде повече от 64 бита, както в моя пример. - person mklement0; 17.05.2015
comment
Тествах го сега, вашият скрипт работи чудесно! Наистина е сложно обаче. Просто питах дали и моята идея ще проработи. - person ; 17.05.2015
comment
Радвам се да го чуя; Благодаря за приемането. Манипулаторът getSha512() не предлага много повече от директното предаване на ... | shasum -a 512 | awk '{print $1}' към do shell script (манипулаторът обвива междуплатформена функция на обвивката, но ако я извиквате от AppleScript, вие са по дефиниция на OSX), с изключение на това, че задейства грешка, ако командата shasum е неуспешна, докато командата do shell script ще маскира това (ще трябва да проверите върнатата стойност). - person mklement0; 17.05.2015
comment
Ще трябва да съхранявате оригиналната сол заедно с комбинирания хеш. Ако съхранявате и двете в единствено поле на база данни, например като <original-salt><combined-hash>, ще трябва да запишете дължината на солта някъде, така че да можете да разделите тази единична стойност обратно на сол и хеш по-късно - една опция е да накарате 1-вия байт от полето на базата данни да съдържа дължината на солта. Това ли питаш? - person mklement0; 17.05.2015
comment
Имам предвид как можете да видите каква е солта, която е генерирана, защото изходът показва само крайния хеш. - person ; 17.05.2015
comment
Имате предвид за отстраняване на грешки? Най-простият, но разрушителен подход е да направите display alert salt; в редактора на скриптове, ако направите журнала видим (View > Show Log), можете да използвате log salt и да видите резултата в долния панел; за повече вижте този отговор. - person mklement0; 17.05.2015
comment
Виждам. Благодаря за вашата помощ. :Д - person ; 17.05.2015
comment
Звучи сякаш липсва try .... преди on error - кодът, който може да се провали, влиза в блока try, а кодът за възстановяване на грешки влиза в блока on error; цялата конструкция се прекратява с end try. - person mklement0; 17.05.2015