Що таке 6-й символ хеша пароля в Linux, і чому це часто коса риса?


83

У Linux який шостий символ хеша пароля зберігається /etc/shadow?

Якщо я спробую створити 100 випадкових паролів за допомогою linux box у стилі щеня, використовуючи shufі /dev/urandom, то шостий символ - це /приблизно половина часу.

Моє запитання не для виробничих цілей, оскільки я завантажую його щоразу свіжого з CD. Чи означає це, що моя система певним чином не налаштована чи незахищена?

Я запустив файл, shufщоб подивитися, чи це busyboxпосилання.

file /usr/bin/shuf

    shuf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped

Я не думаю, що shufце busyboxпосилання тут.

ls -l /usr/bin/shuf

    -rwxr-xr-x 1 root root 41568 Mar  7  2015 /usr/bin/shuf

поки

ls -l /bin/wget

    lrwxrwxrwx 1 root root 14 Apr 29 03:49 wget -> ../bin/busybox

Ось приблизне уявлення про те, що я зробив:

# ! / b i n / b a s h
##  don't try this on any real computer
##  this is not a production script, it is just psuedo code
##  with pseudo results to illustrate a point

##  for this run of 100 ?random? passwords,
##  46 of the 6th character of the hash stored in
##  '/ect/shadow' were '/'

function is_this_really_a_random_password () {
PERHAPS_RANDOM=''
for (( Z=0 ; Z<=8 ; Z++ )) do
PERHAPS_RANDOM="$PERHAPS_RANDOM$( shuf --head-count=1 --random-source=/dev/urandom $FILE_OF_SAFE_CHARACTERS )"
done
echo "$USER_NAME:$PERHAPS_RANDOM" | chpasswd
}

rm sixth-character-often-forward-slash.txt
for (( I=1; I<=100; I++ )) do
is_this_really_a_random_password
grep --regexp=root /etc/shadow | cut --characters=-40 >> sixth-character-often-forward-slash.txt
done
    root:$5$56YsS//DE$HasM6O8y2mnXbtgeE64zK
    root:$5$ho8pk/4/A6e/m0eW$XmjA5Up.0Xig1e
    root:$5$jBQ4f.t1$vY/T/1kX8nzAEK8vQD3Bho
    root:$5$BJ44S/Hn$CsnG00z6FB5daFteS5QCYE
    root:$5$Jerqgx/96/HlV$9Wms5n1FEiM3K93A8
    root:$5$qBbPLe4zYW$/zXRDqgjbllbsjkleCTB
    root:$5$37MrD/r0AlIC40n6$8hplf2c3DgtbM1
    root:$5$.4Tt5S6F.3K7l7E$dAIZzFvvWmw2uyC
    root:$5$A4dX4ZlOoE$6axanr4GLPyhDstWsQ9B
    root:$5$HXAGhryJ/5$40tgmo7q30yW6OF7RUOE
    root:$5$EzNb9t5d$/nQEbEAQyug7Dk9X3YXCEv
    root:$5$HHS5yDeSP$LPtbJeTr0/5Z33vvw87bU
    root:$5$sDgxZwTX5Sm$6Pzcizq4NcKsWEKEL15
    root:$5$FK1du/Paf/$hAy8Xe3UQv9HIpOAtLZ2
    root:$5$xTkuy/BLUDh/N$/30sESA.5nVr1zFwI
    root:$5$PV4AX/OjZ$VU8vX651q4eUqjFWbE2b/
    root:$5$iDuK0IUGijv4l$cdGh8BlHKJLYxPB8/
    root:$5$0DEUp/jz$JBpqllXswNc0bMJA5IFgem
    root:$5$Wz3og/W3Jra/WKA.$6D7Wd4M1xxRDEp
    root:$5$ntHWB.mC3x$Kt4DNTjRZZzpbFvxpMxP
    root:$5$g/uEc/cq$Ptlgu8CXV.vrjrmuok9RRT
    root:$5$/XAHs/5x$Z9J4Zt4k6NxdjJ27PpLmTt
    root:$5$mgfbZeWD0h/$UDGz8YX.D85PzeXnd2K
    root:$5$f4Oh3/bF2Ox/eN$xt/Jkn0LxPnfKP8.
    root:$5$J0mZZXGJG7/v$e16VxghNvZZKRONown
    root:$5$SNza9XFl9i$Qq7r/N6Knt2j74no8H0x
    root:$5$aFCu//xiL$Ocn9mcT2izcnm3rUlBOJg
    root:$5$kMkyos/SLZ/Mm6$wNYxZ9QeuJ8c8T.o
    root:$5$ujXKC/Xnj0h/nQ$PUmePvJZr.UXmTGK
    root:$5$wtEhA/YKaTKH$6VCSXUiIdsfelkCYWV
    root:$5$I1taRlq59YZUGe$4OyIfByuvJeuwsjM
    root:$5$N54oH//j4nbiB$K4i6QOiS9iaaX.RiD
    root:$5$ps8bo/VjPGMP0y4$NTFkI6OeaMAQL7w
    root:$5$IRUXnXO8tSykA8$NatM5X/kKHHgtDLt
    root:$5$VaOgL/8V$m45M9glUYnlTKk8uCI7b5P
    root:$5$/lPDb/kUX73/F3$jJL.QLH5o9Ue9pVa
    root:$5$/sHNL/tVzuu//cr$QasvQxa02sXAHOl
    root:$5$hGI.SMi/7I$fYm0rZP0F5B2D1YezqtX
    root:$5$WsW2iENKA$4HhotPoLRc8ZbBVg4Z5QW
    root:$5$cN6mwqEl$q5S3U85cRuNHrlxS9Tl/PC
    root:$5$wwzLR/YMvk5/7ldQ$s3BJhq5LyrtZww
    root:$5$GUNvr/d15n8/K$CiNHwOkAtxuWJeNy1
    root:$5$nGE75/8mEjM/A$pD/84iLunN/ZNI/JK
    root:$5$77Dn2dHLS$d5bUQhTz.OU4UA.67IGMB
    root:$5$EWrI//1u$uubkPk3YhAnwYXOYsvwbah
    root:$5$Hzfw1UCudP/N/U$Rjcdzdbov1YgozSJ
    root:$5$2y8CKTj.2eTq$7BEIgMWIzAJLl1SWBv
    root:$5$lcWsD/42g8zEEABA$r/vGxqqUZTkJ0V
    root:$5$LPJLc/Xz$tnfDgJh7BsAT1ikpn21l76
    root:$5$ucvPeKw9eq8a$vTneH.4XasgBIeyGSA
    root:$5$Fwm2eUR7$ByjuLJRHoIFWnHtvayragS
    root:$5$yBl7BtMb$KlWGwBL6/WjgHVwXQh9fJS
    root:$5$1lnnh2kOG$rdTLjJsSpC3Iw4Y6nkPhq
    root:$5$WfvmP6cSfb066Z$1WvaC9iL11bPCAxa
    root:$5$qmf/hHvalWa4GE25$m3O2pdu25QBCwU
    root:$5$4P.oT/9HQ$Ygid4WXi0QCEObLVNsqFZ
    root:$5$FNr4Bkj56Y$38mG7mKV0mdb1PMCxrVd
    root:$5$hoNcyURtV$aTidBWHjngc1I0vUTi5bB
    root:$5$rzHmykYT$ATiXdUDUvUnB2fNMUQgwvE
    root:$5$o11Yb/ZQv2/k3wg9$5yShpVejDBk6HB
    root:$5$REPGN//y9H$awpPmUvCqvi6Bd/6bQxF
    root:$5$HbAEY/djXJx$y56GhMwavd7xTQ.jPg6
    root:$5$3T1k5.LZUcy$Cup.LM5AnaBTIaJtBnF
    root:$5$wXaSC/P8bJ$y/0DoYJVjaP09O6GWiki
    root:$5$YuFfY8QPqm/dD$IIh0/tyn.18xEBl5Y
    root:$5$uTTBpjsKG//3Et8$9ibN9mVwSeVyOI4
    root:$5$dASlMLzbVbFMnZ$N4uGBwGHhdg93z/V
    root:$5$03.FA/LnRBb.k7Zl$XOHU2ZlHkV9oz9
    root:$5$2zL1p/VDCi$/QRT7Bo3cZ3Rxb8Y7ddo
    root:$5$0NpZqZs/qt/jIv.$8W/TTM3Gy2UMOWy
    root:$5$a4SXynoro7ucT$qFM2C79QJ15jQ0ZlL
    root:$5$RL0Eg/jroH8/ONP$EzceXz.pz74k104
    root:$5$O3R5V/n1$U.mmCTbpID8xMXbvtzd4ch
    root:$5$0T2nVrv/P/xaRwUD$YVm17XF8kTsL0f
    root:$5$2bRwMNIXobZwn$Q228FJqg6/iRCe9GQ
    root:$5$PyYgL/axfgj/$uaL5y/kdzU4Kzi.JlB
    root:$5$A6QtfJdJ4Gwvx4$d4PA5AJ0806NzRnm
    root:$5$H8Mta5LDgGXp$QGdOJh.bFWgR3L719Z
    root:$5$H06URjv4BtOAbA$EJs1mZYhdKIVgCmn
    root:$5$OeB.O/GrmFB/az$SoE759KE9WIE17Uf
    root:$5$huiB9/sk$el3XMf7SGX81LnD3.SaF8J
    root:$5$fO7tfM.fjdSHA8G6$s.QIjfNniCzFdU
    root:$5$32at3SQJAD/xlw$HbXmBLVXTTyZfxQv
    root:$5$FHBFL/QdFl$FMipxpW0HlEFUIAr7IxF
    root:$5$sHvKf/M5OPdBuZZ$dz4qLOkTLGeCINX
    root:$5$hw4Vu/e34$/82lXu7ISrse.Ihk.qbqT
    root:$5$k1JOy/jRWZ$30YSk7kbhdKOjfDaiWVf
    root:$5$MnX.LUzqrB/B2$JuwqC.SmKFnMUWkEf
    root:$5$arRYf/PG$Xw6PpZNFO656p.Eb636iLt
    root:$5$5op/p8Hqs5$Nj2jA0Qxm80aG4fHW3oz
    root:$5$VHIT9/8yzZ$CpIK4ODps78GcqcsgiMT
    root:$5$.AlH7jBJoh/8$sjuVt.PcRH.vyvB3og
    root:$5$f7Ewinqm$nrJ2p/hKTuiEK//IfCTjth
    root:$5$N.dv/VCvrCADg$peSXfo35KN1dmbw/n
    root:$5$PSc4W./54l/SroH$CFFVOHRYK.Jj8Sp
    root:$5$8UBP3f4IcnAd/N1/$P.ud49qTStQ7Lw
    root:$5$qnXsZ/NlLZh/$nlaQVTS3FCJg1Jb2QG
    root:$5$xOpbbBqENR/7$boYJQzkCkZhRf7Uicf
    root:$5$V93tjZhzT$LrsIZWZmYo4ocRUvCixO6
    root:$5$1MVz8/lf5oC/$rUKpnX23MhFx4.y2ZS

Приблизно половина шести символів хеша /:

cat sixth-character-often-forward-slash.txt | cut --character=14 | sort


    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    /
    .
    .
    .
    .
    2
    5
    6
    8
    8
    B
    d
    D
    e
    e
    E
    f
    H
    I
    j
    j
    j
    J
    k
    k
    K
    l
    L
    M
    M
    n
    n
    N
    q
    r
    r
    r
    s
    S
    S
    t
    t
    T
    U
    U
    U
    U
    V
    w
    x
    X
    X
    X
    Z
    Z
    Z

3
man 3 cryptі прочитайте розділ ПРИМІТКИ для повного опису цього поля.
Стівен Гарріс

(Зліва як підказка для того, хто хоче повністю дослідити): у полі пароля використовується 64 символи; тому, ймовірно, використовується якийсь варіант base64. Тож я б здогадався, що ти бачиш, як pad64 padding, але дивно, що це не в кінці солі тоді ...
derobert

1
З тестуванням Debian & mkpasswd цього не відбувається - цікаво, якщо це станеться з mkpasswd для вас (як це було б простіше перевірити, ніж фактично встановити кореневий пароль):for ((i=0; i<50; ++i)); do pwgen -1 -s 16 | mkpasswd -m sha-256 --stdin ; done | cut -c9 | sort | uniq -c
derobert

Я не можу відтворити це в поточному Ubuntu 14.04 або 16.04. Слэш знаходиться в середині списку частот (використовується фрагмент @derobert вгорі з 5000 петлями замість 50), але він все ще виглядає дещо нерівномірно. Найчастіший графік (q) @ 2,00% від загальної кількості на 1,63 частіший за найменший часті (r) @ 1,22% від загальної кількості.
аріельф

@arielf Сумніваюся, що це є статистично важливим. Вам потрібно буде зробити щось на зразок тесту χ2 , але це добре за межами території Unix та Linux і потрапити на територію Cross Valified .
дероберт

Відповіді:


86

Формат і джерело хешу

Формат хеша для паролів - $<type>$<salt>$<hash>де <type> 5хеш на основі SHA-256. Сіль, як правило, принаймні 8 символів (і є у прикладах у питанні), тому шостий символ є частиною солі.

Ці хеші, ймовірно, породжені версією тіньового набору інструментів (пакет src shadowв Debian, shadow-utilsу CentOS)

Я спробував з’ясувати, чому саме код зміщує косу рису. (спасибі @thrig за те, що спочатку розкопали код.)

TLDR: Це трохи цікаво, але це не має значення.


Код, що генерує сіль

В libmisc/salt.c, ми знаходимо gensaltфункцію, яка викликає l64aцикл:

strcat (salt, l64a (random()));
do {
       strcat (salt, l64a (random()));
} while (strlen (salt) < salt_size);

Цикл бере з випадкового числа random(), перетворює його на шматок струни і з'єднує це з струною, що утворює сіль. Повторюйте, поки не буде зібрано достатньо символів.

Однак те, що відбувається l64a, цікавіше. Внутрішній цикл генерує один символ одночасно із вхідного значення (яке прийшло random()):

for (i = 0; value != 0 && i < 6; i++) {
    digit = value & 0x3f;

    if (digit < 2) {
        *s = digit + '.';
    } else if (digit < 12) {
        *s = digit + '0' - 2;
    } else if (digit < 38) {
        *s = digit + 'A' - 12;
    } else {
        *s = digit + 'a' - 38;
    }

    value >>= 6;
    s++;
}

Перший рядок циклу ( digit = value & 0x3f) вибирає шість біт із вхідного значення, і ifпункти перетворюють значення, утворене тими, в символ. ( .для нуля, /для одного, 0для двох тощо)

l64aприймає а, longале значення, виведені по random(), обмежені значенням RAND_MAX, яке, як видається, є 2147483647 або 2 ^ 31 - 1 на glibc. Отже, значення, яке йде до l64aвипадкового числа, становить 31 біт. Беручи одночасно 6 біт або значення 31 біт, ми отримуємо п'ять розумно рівномірно розподілених символів плюс шести, який походить лише з одного біта!

Останній символ, згенерований символом, l64aне може бути a ., оскільки цикл також має умову value != 0, а замість .шестого символу l64aповертає лише п'ять символів. Отже, половина часу, шостий символ є a /, а половина часу l64aповертає п'ять або менше символів. В останньому випадку наступне l64aтакож може генерувати косу рису на перших позиціях, тож у повній солі шостий символ повинен бути косою рискою трохи більше половини часу.

Код також має функцію рандомізації довжини солі, це 8-16 байт. Один і той же ухил символу косою рисою трапляється і з подальшими дзвінками, через l64aякі 11-й та 12-й символи також матимуть косу рису частіше за все. У 100 солях, представлених у запитанні, 46 косого ряду на шостому місці та 13 та 15 у 11 та 12 позиціях відповідно. (трохи менше половини солей коротше 11 символів).

На Debian

У Debian я не міг відтворити це за допомогою прямої, chpasswdяк показано в питанні. Але chpasswd -c SHA256показує таку саму поведінку. Згідно з посібником, за замовчуванням дія, без цього -c, полягає в тому, щоб PAM обробляв хешування, тому, мабуть, PAM на Debian принаймні використовує інший код для отримання солі. Однак я не дивився на PAM-код жодного дистрибутива.

(У попередній версії цієї відповіді було зазначено, що ефект не з’явився на Debian. Це було неправильно.)

Значення та вимоги до солей

Чи це має значення? Як прокоментував @RemcoGerlich, це майже лише питання кодування. Це ефективно зафіксує деякі шматочки солі до нуля, але, ймовірно, це не матиме істотного ефекту в цьому випадку, оскільки походження цих шматочків - це цей заклик srandomу seedRNG:

srandom (tv.tv_sec ^ tv.tv_usec ^ getpid ());

Це варіант старого звичаю посіву РНГ з поточним часом. ( tv_secа tv_usecце секунди та мікросекунди поточного часу, getpid()дає ідентифікатор процесу, якщо запущений процес.) Оскільки час та PID не є дуже непередбачуваними, кількість випадкових випадків тут, швидше за все, не більша за те, що може містити кодування.

Час та PID - це не те, з чого ви хочете створити ключі , але можуть бути непередбачуваними для солі. Солі повинні бути чіткими для запобігання грубої сили тестування декількох хешей паролів за допомогою одного розрахунку, але також повинні бути непередбачуваними, щоб запобігти або уповільнити цільове попереднє обчислення, яке може бути використане для скорочення часу від отримання хешей пароля до отримання фактичних паролів .

Навіть із незначними проблемами, поки алгоритм не генерує однакову сіль для різних паролів, це повинно бути добре. І не здається, навіть коли генерується кілька десятків у циклі, як показує список у запитанні.

Крім того, розглянутий код не використовується ні для чого, крім створення солей для паролів, тому ніяких наслідків щодо проблем в інших місцях немає.

Щодо солей, дивіться також, наприклад, це на Stack Overflow та це на security.SE .

Висновок

На закінчення, з вашою системою немає нічого поганого. Переконатися, що ваші паролі корисні і не використовуються у непов'язаних системах, корисніше задуматися.


2
Тож фактичні солі не є упередженими, це лише артефакт того, як вони кодуються, і це не має жодних наслідків для безпеки, чи правильно це?
RemcoGerlich

8
@RemcoGerlich Це визначення підручника упередженості. Тому що не всі біти обліковуються рівномірно. Це також має наслідки для інших проектів, коли цей код використовується в несольовому контексті. Що стосується солей у паролях для / etc / shadow, це не показник, але це викликає занепокоєння.
Аарон Топонс

@RemcoGerlich, досить так. Гаразд, це не сильна RNG, тому ми могли б говорити про упередження в цьому. Але для безпеки це не має значення для солі.
ilkkachu

3
Ви неправильно інтерпретували публікацію про безпеку.SE, з якою ви посилалися, і прийнята відповідь на повідомлення про те, на яке ви пов’язані, є неправильним, тому є ще одна відповідь, що суперечить їй більше ніж у 10 разів. Заява про те, що "солі потрібно лише відрізняти" не відповідає дійсності; ентропія солі питань, тому що це те , що контролює, наскільки це збільшує складність передобчислювання. Ці солі мають меншу ентропію, ніж могли б за своєю довжиною, через зміщення. Не критично менше, але щось на кшталт 5 біт менше. Це вада.
варення

Можливо, хтось повинен поставити питання безпеки.SE, яке конкретно посилається на цю функцію, щоб отримати кваліфіковану думку.
варення

26

Цей символ є частиною солі в crypt(3)посібнику. З огляду на те, що довжина солі (рядок між $5$ідентифікатором та наступними $) змінюється для виставлених хешів, я не точно впевнений, що ілюструє вибір випадкового символу з цього конкретного стовпця для кількох паролів.

З іншого боку, у всій солі порівняно з іншими можливими символами (більш ніж 18) порівняно з іншими можливими символами (102 екземпляри) / є більш поширеним , тож щось у цьому надає перевагу цьому персонажу в солі;chpasswd

for x in `seq 1 100000`; do
  echo testacct:asdfasdfasdf | chpasswd -c SHA256
  awk -F: '/testacct/{print $2}' /etc/shadow | awk -F\$ '{print $3}' >> salts
done
perl -nle 'print for m/(.)/g' salts | sort | uniq -c | sort -nr | head -5

на системі RedHat EL 6 з'являється:

   1006 /
    195 X
    193 U
    193 q
    193 e

І так, код у shadow-utils-4.1.5.1-5.el6виразному ухилі до /цього може полегшити атаки на словник:

#include <sys/time.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

// these next two borrowed from libmisc/salt.c of shadow-4.1.5.1 from
// Centos 6.8 RPM at http://vault.centos.org/6.8/os/Source/SPackages/shadow-utils-4.1.5.1-5.el6.src.rpm
char *l64a(long value)
{
    static char buf[8];
    char *s = buf;
    int digit;
    int i;

    if (value < 0) {
        abort();
    }

    for (i = 0; value != 0 && i < 6; i++) {
        digit = value & 0x3f;

        if (digit < 2) {
            *s = digit + '.';
        } else if (digit < 12) {
            *s = digit + '0' - 2;
        } else if (digit < 38) {
            *s = digit + 'A' - 12;
        } else {
            *s = digit + 'a' - 38;
        }

        value >>= 6;
        s++;
    }

    *s = '\0';

    return (buf);
}

static void seedRNG(void)
{
    struct timeval tv;
    static int seeded = 0;

    if (0 == seeded) {
        (void) gettimeofday(&tv, NULL);
        srandom(tv.tv_sec ^ tv.tv_usec ^ getpid());
        seeded = 1;
    }
}

int main(void)
{
    seedRNG();
    for (int x = 0; x < 1000; x++) {
        printf("%s\n", l64a(random()));
    }

    exit(0);
}

Результати:

% ./salttest | perl -nle 'print for m/(.)/g' | sort | uniq -c | sort -nr | head -3
 593 /
  96 8
  93 3

А потім, використовуючи ті самі підпрограми з останнього https://github.com/shadow-maint/shadow/blob/master/libmisc/salt.c, ми виявляємо, що все ще є упередженість у напрямку /. Так що так, це помилка, яку слід виправити, тому /не надається такої переваги, оскільки в ідеалі сольові символи повинні бути однаково зваженими.


14
Зміни солі самі по собі не є шкідливими (на відміну від упередженості, скажімо, ключа). Сіль лише повинна бути унікальною, вона не повинна бути непередбачуваною. Сіль, що складається з MAC-адреси (або чогось, що однозначно ідентифікує апарат), і часу (якщо припустити, що годинник не йде назад) буде добре. Заява про те, що "в ідеалі сольові символи повинні бути однаково зважені", є помилковим.
Жиль

7
@thrig Ні, передбачувана сіль не допомагає при атаках на словники, оскільки сіль не допомагає при атаках на словники як такі. Сіль допомагає при атаках, націлених на кілька облікових записів (точніше: декілька хешей - також послідовні хеші на один і той же рахунок), і для цього важливо лише те, що сіль відрізняється для різних облікових записів. Непередбачуваність солей не має значення, лише їх унікальність (насправді навіть низька кількість повторень є досить хорошою).
Жиль

3
Ключовим моментом того, що говорить Гілл, є те, що в солоному генераторі є багато місця, але не так вже й погано, що в одному тіньовому файлі (або в декількох системах, на які зловмисник може напасти одразу, виникають фактичні зіткнення) ). Це все, що має значення для роботи солі. Потрібно лише трохи випадковості, щоб перемогти таблиці Веселки .
Пітер Кордес

7
Однак якщо сіль погано генерується, вона не вселяє довіру до решти криптокоду.
іммібіс

3
З солями вони повинні бути унікальними у всьому світі. Вони не повинні бути випадковими, і вони не повинні бути секретними. Але вони мають бути унікальними у всьому світі. Виявляється, це важче зробити, якщо ви спробуєте збільшити лічильник або створити якийсь химерний детермінований алгоритм, ніж просто захоплювати випадкові біти з ОС RNG. Якщо ви генеруєте 16 базових 64 символів випадковим чином, у вас є / 64 ^ 16 шанс зіткнення. Звичайно, вся суть солей полягає в тому, щоб зробити напади веселки на стіл безрезультатними. У цьому випадку 16-символьний простір сольової бази64 буде 64 ^ 15 <n <64 ^ 16. Не демонстратор, але легко фіксується.
Аарон Топонс

4

mkpasswd(1)може бути передумовою crypt(3), але це не те саме, що запуск chpasswd(1), який є частиною пакету "тіньові утиліти" на CentOS і "passwd" на Debian. Натомість слід порівнювати яблука з яблуками. Розглянемо наступний сценарій:

#!/bin/bash

# This repeatedly changes a `saltuser' password
# and grabs the salt out of /etc/shadow.
# Requires root and the existence of `saltuser' user.

if [ $EUID -ne 0 ]; then
    echo "This script requires root access to read /etc/shadow."
    exit 1
fi

grep -q saltuser /etc/passwd

if [ $? -ne 0 ]; then
    echo "This script requires the 'saltuser' to be present."
    exit 2
fi

: > /tmp/salts.txt

for i in {1..1000}; do
    PW=$(tr -cd '[[:print:]]' < /dev/urandom | head -c 64)
    echo "saltuser:${PW}" | chpasswd -c SHA256 -s 0 2> /dev/urandom
    awk -F '$' '/^saltuser/ {print $3}' /etc/shadow >> /tmp/salts.txt
done

while read LINE; do
    # 6th character in the salt
    echo ${LINE:5:1}
done < /tmp/salts.txt | sort | uniq -c | sort -rn

Вихід від Debian Sid:

512 /
 14 T
 13 W
 13 v
 13 t
 12 x
 12 m
 12 d
 11 p
 11 L
 11 F
 11 4
 10 s
 10 l
 10 g
 10 f
 10 7
 10 6
  9 Z
  9 w
  9 N
  9 H
  9 G
  9 E
  9 A
  8 Y
  8 X
  8 r
  8 O
  8 j
  8 c
  8 B
  8 b
  8 9
  7 u
  7 R
  7 q
  7 P
  7 M
  7 k
  7 D
  6 z
  6 y
  6 U
  6 S
  6 K
  6 5
  5 V
  5 Q
  5 o
  5 J
  5 I
  5 i
  5 C
  5 a
  5 3
  4 n
  4 h
  4 e
  4 2
  4 0
  4 .
  3 8
  3 1

Вихід від CentOS 7:

504 /
 13 P
 13 B
 12 s
 12 Z
 11 e
 11 Y
 11 O
 11 L
 11 G
 10 w
 10 u
 10 q
 10 i
 10 h
 10 X
 10 I
 10 E
  9 x
  9 g
  9 f
  9 W
  9 F
  9 C
  9 9
  9 8
  8 v
  8 t
  8 c
  8 b
  8 S
  8 H
  8 D
  8 0
  7 z
  7 y
  7 o
  7 k
  7 U
  7 T
  7 R
  7 M
  7 A
  7 6
  7 4
  7 1
  6 p
  6 d
  6 a
  6 Q
  6 J
  6 5
  6 .
  5 r
  5 m
  5 j
  5 V
  5 3
  5 2
  4 n
  4 l
  4 N
  4 K
  3 7

Отже, проблема не характерна лише для CentOS, але, ймовірно, виходить з висхідного потоку, звідки обидва проекти тягнуться.


Це : > /tmp/salts.txtте саме, що touch /tmp/salts.txt? :це НОП, правда?
whowithpc

1
@someonewithpc Це спосіб POSIX для спорожнення файлу. touch(1)створює файл, якщо його не існує, а просто оновлює змінену часову позначку, якщо вона існує. Очистити файл не є правильним. : > fileгарантуватиме, що вона існує і що вона порожня.
Аарон Топонс

@Aaron, так, ви абсолютно праві. Це не зовсім конкретно для одного розподілу.
ilkkachu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.