লিনাক্সে পাসওয়ার্ড হ্যাশের 6th ষ্ঠ অক্ষরটি কী এবং এটি প্রায়শই স্ল্যাশ হয় কেন?


83

লিনাক্সে, পাসওয়ার্ড হ্যাশের ষষ্ঠ অক্ষরটি /etc/shadowকীভাবে সংরক্ষণ করা হয় ?

আমার কুকুরছানা শৈলীর লিনাক্স বাক্সে, যদি আমি ব্যবহার করে 100 টি এলোমেলো পাসওয়ার্ড তৈরি করার চেষ্টা করি shufএবং /dev/urandom, তবে ষষ্ঠ অক্ষরটি /প্রায় অর্ধেক সময় হয়।

আমার প্রশ্ন উত্পাদনের উদ্দেশ্যে নয়, যেহেতু আমি প্রতিবার সিডি থেকে তাজা তা বুট করি। এর অর্থ কি আমার সিস্টেমটি ভুলভাবে কনফিগার করা হয়েছে বা কোনওভাবে সুরক্ষিত নয়?

আমি 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

প্রায় 6th ষ্ঠ হ্যাশ অক্ষরের অর্ধেকটি হ'ল /:

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 টি অক্ষর ব্যবহৃত হয়েছে; সুতরাং সম্ভবত কিছু বেস 64 বৈকল্পিক ব্যবহৃত হয়। তাই আমি চাই অনুমান কি দেখছি করুন Base64- প্যাডিং, কিন্তু এটা বিজোড় এটি লবণ শেষে নয় তারপর আছে ...
derobert

1
ডেবিয়ান টেস্টিং এবং এমকেপাসউইডের সাহায্যে এটি ঘটে না ious যদি আপনার জন্য এমকেপাসউইডের সাথে এটি ঘটে তবে কৌতূহল হয় (কারণ এটি রুট পাসওয়ার্ডটি নির্ধারণের চেয়ে পরীক্ষা করা আরও সহজ হবে):for ((i=0; i<50; ++i)); do pwgen -1 -s 16 | mkpasswd -m sha-256 --stdin ; done | cut -c9 | sort | uniq -c
ডার্বোবার্ট

আমি এটি বর্তমান উবুন্টু 14.04 বা 16.04 এ পুনরুত্পাদন করতে পারি না। স্ল্যাশ ফ্রিকোয়েন্সি তালিকার মাঝের কাছে (উপরে @ ডারবার্ট স্নিপেটের উপরে 50 এর পরিবর্তে 5000 লুপ ব্যবহার করা হয়েছে) তবে এটি এখনও কিছুটা অ-অভিন্ন বলে মনে হচ্ছে, মোট ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন চার্চ (কিউ) হওয়া ঘন ঘন একটি (আর) @ মোট 1.22%
আরিফেল

@ প্রায় আমি সন্দেহ করি যে এটি একটি পরিসংখ্যানগত-তাৎপর্যপূর্ণ। নিশ্চিত হওয়ার জন্য আপনাকে χ2 পরীক্ষার মতো কিছু করতে হবে, তবে এটি ইউনিক্স এবং লিনাক্স অঞ্চলের বাইরে এবং ক্রস ভ্যালিডেটেড অঞ্চলে প্রবেশ করতে হবে।
ডারোবার্ট

উত্তর:


86

হ্যাশ ফর্ম্যাট এবং উত্স

পাসওয়ার্ড হ্যাশটির ফর্ম্যাটটি $<type>$<salt>$<hash>যেখানে <type> 5একটি SHA-256 ভিত্তিক হ্যাশ। লবণ সাধারণত কমপক্ষে 8 টি অক্ষর হয়, (এবং প্রশ্নের উদাহরণে রয়েছে) সুতরাং ষষ্ঠ অক্ষর লবণের অংশ is

সেই হ্যাশগুলি সম্ভবত ছায়া সরঞ্জাম স্যুটের একটি সংস্করণ দ্বারা উত্পাদিত হয়েছে (সেন্টিয়ানসে shadowডেবিয়ানের এসআরসি প্যাকেজ shadow-utils)

আমি কেন চেষ্টা করতে চেষ্টা করেছি, কেন ঠিক, কোড স্ল্যাশকে পক্ষপাতিত্ব করে। (মূলত কোডটি খননের জন্য @ থ্রিগকে ধন্যবাদ জানাই))

টিএলডিআর: এটি কিছুটা আকর্ষণীয়, তবে কিছু যায় আসে না।


কোড লবণ উত্পন্ন

ইন 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 এ গ্লোবিকে প্রদর্শিত হয়। সুতরাং, যে মানটি যায় তা l64aহ'ল 31 বিটগুলির একটি এলোমেলো সংখ্যা। একসাথে 6 টি বিট বা 31 বিট মান নিয়ে আমরা পাঁচটি যুক্তিসঙ্গত সমানভাবে বিতরণ করা অক্ষর, এবং একটি ষষ্ঠী যা কেবলমাত্র একটি বিট থেকে আসে!

দ্বারা নির্মিত শেষ অক্ষরটি l64aএকটি হতে পারে না ., যেহেতু লুপটিতেও শর্ত থাকে value != 0এবং .ষষ্ঠ অক্ষরের পরিবর্তে l64aকেবল পাঁচটি অক্ষর ফিরে আসে। অতএব, অর্ধ সময়, ষষ্ঠ চরিত্রটি একটি /এবং l64aঅর্ধবার পাঁচটি বা তার চেয়ে কম অক্ষর দেয়। পরবর্তী ক্ষেত্রে, নিম্নলিখিতগুলি l64aপ্রথম অবস্থানে স্ল্যাশ উত্পন্ন করতে পারে, সুতরাং একটি পূর্ণ লবণের মধ্যে, ষষ্ঠ অক্ষরটি অর্ধবারের চেয়ে কিছুটা বেশি স্ল্যাশ হওয়া উচিত।

কোডটিতে লবণের দৈর্ঘ্য এলোমেলো করতে একটি ফাংশন রয়েছে, এটি 8 থেকে 16 বাইট হয়। স্ল্যাশ চরিত্রের জন্য একই পক্ষপাতিত্বটি আরও কলগুলির সাথে ঘটে l64aযা 11 তম এবং 12 তম চরিত্রের কারণে অন্য যে কোনও কিছুর চেয়ে প্রায়শই স্ল্যাশ ঘটায়। প্রশ্নের উপস্থাপিত 100 টি লবণের ষষ্ঠ স্থানে 46 টি স্ল্যাশ রয়েছে এবং যথাক্রমে 11 ও 12 তম অবস্থানে 13 এবং 15 রয়েছে। (লবণের অর্ধেকের চেয়ে কিছুটা কম 11 টি অক্ষরের চেয়ে কম)।

দেবিয়ানে

দেবিয়ান-তে, আমি chpasswdপ্রশ্নের মতোই সোজা দিয়ে এটিকে পুনরুত্পাদন করতে পারিনি । তবে chpasswd -c SHA256একই আচরণ দেখায়। ম্যানুয়াল অনুসারে, ছাড়াই ডিফল্ট ক্রিয়াটি -cহ'ল প্যাশটিকে হ্যাশিং পরিচালনা করতে দেয়, সুতরাং স্পষ্টতই ডিবানের পিএএম কমপক্ষে লবণ উত্পন্ন করতে আলাদা কোড ব্যবহার করে। যাইহোক, আমি কোনও বিতরণে পিএএম কোডটি দেখিনি।

(এই উত্তরের পূর্ববর্তী সংস্করণে বলা হয়েছিল যে প্রভাবটি দেবিয়ানের উপরে প্রকাশিত হয়নি That এটি সঠিক ছিল না))

গুরুত্ব এবং লবণের জন্য প্রয়োজনীয়তা

এটা কি ব্যাপার, যদিও? @ রেমকো গ্রিলিচ যেমন মন্তব্য করেছেন, এটি কেবল এনকোডিংয়ের প্রশ্ন। এটা তোলে কার্যকরভাবে শুন্যতে লবণ কিছু বিট ঠিক করবে, কিন্তু এটা, সম্ভবত এই এই ক্ষেত্রে কোন উল্লেখযোগ্য প্রভাব ফেলবে যেহেতু যারা বিট উৎপত্তি এই আহবান srandomমধ্যে seedRNG:

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

এটি বর্তমান সময়ের সাথে কোনও আরএনজি বীজ দেওয়ার প্রবীণ রীতিগুলির একটি বৈকল্পিক। ( tv_secএবং tv_usecবর্তমান সময়ের সেকেন্ড এবং মাইক্রোসেকেন্ডগুলি, getpid()চলমান প্রক্রিয়াটি যদি প্রক্রিয়াটিকে আইডি দেয়)) সময় এবং পিআইডিগুলি খুব অনাকাঙ্ক্ষিত না হওয়ায়, এলোমেলোনের পরিমাণটি সম্ভবত এনকোডিংটি ধারণ করতে পারে তার চেয়ে বড় নয়।

সময় এবং পিআইডি এমন কিছু নয় যা দিয়ে আপনি কী তৈরি করতে চান তবে এটি লবণের জন্য যথেষ্ট অনির্দেশ্য হতে পারে। একক গণনা সহ একাধিক পাসওয়ার্ড হ্যাশ পরীক্ষা করতে ব্রুট-ফোর্স প্রতিরোধ করতে লবণের অবশ্যই পৃথক হওয়া উচিত , তবে লক্ষ্যবস্তু পূর্বাভাস রোধ করতে বা আস্তে আস্তে আস্তে আস্তে পাসওয়ার্ড পাওয়ার জন্য পাসওয়ার্ড হ্যাশ পেতে সময়কে সংক্ষিপ্ত করতে ব্যবহৃত হতে পারে বলেও অনাকাঙ্ক্ষিত হওয়া উচিত which ।

এমনকি সামান্য সমস্যাগুলির সাথেও, যতক্ষণ না অ্যালগোরিদম বিভিন্ন পাসওয়ার্ডের জন্য একই লবণ তৈরি করে না, ঠিক আছে। এবং মনে হয় না, এমনকি যখন লুপটিতে কয়েক ডজন জেনারেট করে, প্রশ্নের তালিকায় দেখা যাচ্ছে।

এছাড়াও, প্রশ্নযুক্ত কোডটি পাসওয়ার্ডের জন্য সল্ট তৈরি করা ছাড়া অন্য কোনও কিছুর জন্য ব্যবহৃত হয় না, তাই অন্য কোথাও সমস্যা সম্পর্কিত কোনও প্রভাব নেই।

সল্ট জন্য, যেমন, তাও দেখতে স্ট্যাক ওভারফ্লো এই এবং security.SE এই

উপসংহার

উপসংহারে, আপনার সিস্টেমে কোনও ভুল নেই। আপনার পাসওয়ার্ডগুলি কোনও ভাল কিনা এবং সম্পর্কযুক্ত সিস্টেমে না ব্যবহৃত হয়েছে তা নিশ্চিত করা আরও চিন্তাভাবনা করে।


2
সুতরাং প্রকৃত লবণের পক্ষপাতদুষ্ট নয়, এটি কীভাবে এনকোড করা হয়েছে এবং এটিতে কোনও সুরক্ষা সম্পর্কিত কোনও প্রভাব নেই, এটি কি সঠিক?
রিমকো জারলিচ

8
@ রেমকো গ্রিলিচ এটি একটি পক্ষপাতিত্বের পাঠ্যপুস্তক সংজ্ঞা। কারণ সমস্ত বিট সমানভাবে হিসাব করা হচ্ছে না। অন্যান্য কোডেও এই কোডটির কোনও প্রভাব নেই, যেখানে এই কোডটি নুন-লবণের প্রসঙ্গে ব্যবহৃত হয়। পাসওয়ার্ডগুলিতে / ইত্যাদি / ছায়ার জন্য লবণের হিসাবে এটি কোনও শোস্টোপার নয়, তবে এটি উদ্বেগজনক।
অ্যারন টপোনস

@ রেমকো জারলিচ, বেশ হ্যাঁ। ঠিক আছে, এটি একটি শক্তিশালী আরএনজি নয়, তাই আমরা এতে পক্ষপাতিত্ব সম্পর্কে কথা বলতে পারি। তবে সুরক্ষার ভিত্তিতে এটি কোনও নুনের জন্য গুরুত্বপূর্ণ নয়।
ilkkachu

3
আপনি যে সুরক্ষার সাথে লিঙ্ক করেছেন সে সম্পর্কে আপনি ভুল ব্যাখ্যা করেছেন SE এসই পোস্টের সাথে এবং আপনি যে এসও পোস্টের সাথে লিঙ্ক করেছেন তা গ্রহণযোগ্য উত্তর ভুল, যার কারণেই এর বিপরীতে 10x এরও বেশি ভোটের সাথে আরও একটি উত্তর রয়েছে। "সল্ট কেবল আলাদা হওয়া দরকার" উক্তিটি সত্য নয়; এনট্রপি একটি লবণ বিষয়ে, কারণ যে কি কত precomputation অসুবিধা বৃদ্ধি দ্বারা নিয়ন্ত্রণ আছে। এই লবণের পক্ষপাতের কারণে তাদের দৈর্ঘ্যের চেয়ে কম এনট্রপি থাকে। না সমালোচকদের কম, কিন্তু 5 ভালো কিছু বিট কম। এটি একটি ত্রুটি।
hobbs

সম্ভবত কারও একটি সুরক্ষা করা উচিত SE এসই প্রশ্নটি একটি বিশেষ মতামত পাওয়ার জন্য বিশেষভাবে এই ফাংশনটি উল্লেখ করে।
hobbs

26

সেই চরিত্রটি crypt(3)ম্যানুয়াল অনুসারে লবণের অংশ । প্রদত্ত হ্যাশগুলির জন্য লবণের দৈর্ঘ্য ( $5$আইডি এবং পরবর্তীগুলির মধ্যে স্ট্রিং $) পরিবর্তিত হয়, আমি নির্দিষ্ট পাসওয়ার্ডের জন্য নির্দিষ্ট কলাম থেকে একটি এলোমেলো চরিত্রটি কী কী চিত্রিত করে তা ঠিক নিশ্চিত নই।

অন্যদিকে, অন্যান্য সম্ভাব্য অক্ষরের তুলনায় পুরো লবণের ক্ষেত্রে / এটি আরও বেশি জনপ্রিয় (১০২ টি দৃষ্টান্ত) রয়েছে (প্রায় ১৮), সুতরাং কিছু কিছু লবণের ক্ষেত্রে সেই চরিত্রের পক্ষে রয়েছে বলে মনে হয়;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

একটি রেডহ্যাট ইএল 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
লবণের পক্ষপাতগুলি নিজের মধ্যে ক্ষতিকারক নয় (পক্ষপাতিত্বের বিপরীতে, বলুন, একটি কী)। লবণের জন্য কেবল অনন্য হওয়া দরকার, এটি অনাকাঙ্ক্ষিত হওয়ার দরকার নেই। একটি ম্যাক ঠিকানা (বা মেশিনটিকে স্বতন্ত্রভাবে চিহ্নিত করে এমন কিছু) এবং একটি সময়যুক্ত (ঘড়িটি পিছনে যায় না ধরে) নিয়ে একটি লবণ ভাল থাকবে। "আদর্শভাবে লবণের চরিত্রগুলি সমানভাবে ওজন করা উচিত" বিবৃতিটি ভুল।
গিলস

7
@ থ্রিগ্র নং, অনুমানযোগ্য লবণ অভিধান আক্রমণগুলিতে সহায়তা করে না, কারণ লবণ অভিধানের আক্রমণগুলিতে যেমন সহায়তা করে না। একটি লবণ আক্রমণগুলিতে সহায়তা করে যা একাধিক অ্যাকাউন্টকে লক্ষ্য করে তোলে (আরও সুনির্দিষ্টভাবে: একাধিক হ্যাশ - একই অ্যাকাউন্টে ক্রমাগত হ্যাশও) এবং এর জন্য, সমস্ত বিষয় লবণটি বিভিন্ন অ্যাকাউন্টের জন্য আলাদা is লবণের অপ্রকাশ্যতা অপ্রাসঙ্গিক, কেবল তাদের স্বাতন্ত্র্য (আসলে, এমনকি একটি স্বল্প পুনরাবৃত্তি গণনাও যথেষ্ট ভাল)।
গিলস

3
গিলস যা বলছে তার মূল বিষয়টি হ'ল লবণের জেনারেটরটির পক্ষে দরিদ্র হওয়ার মতো অনেক জায়গা রয়েছে তবে এটি এত খারাপ নয় যে একই ছায়া ফাইলে প্রকৃত সংঘর্ষ রয়েছে (বা একাধিক সিস্টেমে যে আক্রমণকারী একবারে আক্রমণ করতে পারে) )। এই কাজটি লবণের জন্য গুরুত্বপূর্ণ। রেইনবো টেবিলগুলিকে পরাস্ত করতে এটি কেবল কিছুটা এলোমেলো লাগে ।
পিটার কর্ডস

7
তবে, লবণটি খারাপভাবে উত্পন্ন হলে, এটি ক্রিপ্টো কোডের বাকী অংশে আত্মবিশ্বাস জাগায় না।
ইমিগ্রিস

3
লবণের সাহায্যে এগুলি বিশ্বব্যাপী অনন্য হতে হবে। তাদের এলোমেলো হওয়ার দরকার নেই এবং তাদের গোপনীয় হওয়ার দরকার নেই। তবে তাদের বিশ্বব্যাপী অনন্য হওয়া দরকার। দেখা যাচ্ছে, ওএস আরএনজি থেকে এলোমেলো বিটগুলি ধরার চেয়ে আপনি যদি কাউন্টারকে বাড়ানোর চেষ্টা করেন বা কিছু অভিনব নির্বাহক অ্যালগরিদম তৈরি করতে চান তবে এটি করা শক্ত। যদি আপনি এলোমেলোভাবে 16 বেস 64 অক্ষর উত্পন্ন করেন তবে আপনার সংঘর্ষের সম্ভাবনা / 64/16 থাকবে। অবশ্যই, লবণের পুরো পয়েন্টটি হ'ল রেইনবো টেবিলের আক্রমণগুলিকে ফলহীন করে তোলা। এই ক্ষেত্রে, একটি 16-অক্ষরের বেস 64 লবণের স্থানটি 64 ^ 15 <n <64 ^ 16 হবে। শোস্টোপার নয়, তবে সহজেই স্থির।
অ্যারন টপোনস

4

mkpasswd(1)crypt(3)এটির সামনের chpasswd(1)দিকের প্রান্ত হতে পারে তবে এটি চলার মতো নয় , যা সেন্টোসের "শেডো-ইউস" প্যাকেজের অংশ এবং দেবিয়ানের "পাসডাব্লুড"। পরিবর্তে, আপনি আপেল থেকে আপেল তুলনা করা উচিত। নিম্নলিখিত স্ক্রিপ্ট বিবেচনা করুন:

#!/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

দেবিয়ান সিড থেকে আউটপুট:

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

সুতরাং, সমস্যাটি সেন্টোসের কাছে অনন্য নয়, তবে সম্ভবত এটি প্রবাহ থেকে আসছে যেখানে উভয় প্রকল্পই এখান থেকে টানছে।


কি : > /tmp/salts.txtহিসাবে একই touch /tmp/salts.txt? :একটি এনওপি, ঠিক আছে?
someonewithpc

1
@ someonewithpc এটি কোনও ফাইল খালি করার জন্য পসিক্স উপায়। touch(1)এটি উপস্থিত না থাকলে একটি ফাইল তৈরি করে তবে এটি উপস্থিত থাকলে কেবল পরিবর্তিত টাইমস্ট্যাম্প আপডেট করে। এটি কোনও ফাইল খালি করার সঠিক উপায় নয়। : > fileগ্যারান্টি দিবে যে এটি বিদ্যমান এবং এটি খালি।
অ্যারন টপোনস

অ্যারন, হ্যাঁ, আপনি একেবারে সঠিক। এটি একটি বিতরণের জন্য সম্পূর্ণ নির্দিষ্ট নয়।
ilkkachu
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.