Linux, yeni parolanın öncekine benzer olduğunu nereden biliyor?


145

Birkaç kez çeşitli Linux makinelerde bir kullanıcı şifresini değiştirmeye çalıştım ve yeni şifre eskisine benziyorsa, işletim sistemi çok benzer olduklarından şikayet etti.

Hep merak etmişimdir, sistem bunu nasıl biliyor? Şifrenin bir karma olarak kaydedildiğini düşündüm. Bu, sistem yeni şifreyi benzerlikle karşılaştırabildiğinde eski şifrenin aslında düz metin olarak kaydedildiği anlamına mı geliyor?


30
İlk kapalı: düz metin? Hayır. Eğer (!) Kaydedilmişse hash'i kaydeder ve hash'leri karşılaştırın. Linux'ta mevcut şifreyi yeni şifre ile kontrol etse de. Her şey şifre değiştirirken kullanıcı tarafından sağlanır.
Rinzwind

42
@Rinzwind Ancak hash'leri karşılaştırmak işe yaramaz çünkü bir karakter farklılığı tamamen farklı bir hash ile sonuçlanmalıdır
slhck

17
Ayrıca bkz. Facebook düz metin şifrelerini saklıyor mu? üzerine Bilgi Güvenliği (eski için hiçbir düz metin) sadece eski şifre karma ve yeni şifre düz metin verilen benzerliği tespit etmek için başka yollar.
Bob,

21
Eski bir parola ve düz metin yeni parola arasındaki benzerliği gerçekten test edebilirsiniz. Basitçe, yenisine benzer bir şifre listesi oluşturun, hepsine karma yapın ve elde edilen karmaları eski şifre karma ile karşılaştırın. Herhangi bir eşleşme varsa, o zaman benzer.
BWG

2
@BWG: Bu, hafif bir aşırı basitleştirmedir - mevcut karma şemalar, hash tuzunu tuzlar, bu nedenle ilk önce eski parola karma değerinden tuzu çıkarmaya ve bu tuzu yeni-benzer şifreleriniz için kullanmaya dikkat edin. (Bunu işaret ediyorum, çünkü API belirli bir tuzu zorlamanın bir yolunu ortaya
Ulrich Schwarz

Yanıtlar:


156

Kullanırken hem eski hem de yeni şifreyi girmeniz gerektiğinden passwd, düz metin olarak, bellekte, sürücüye bir yere yazmadan kolayca karşılaştırılabilirler.

Aslında şifreniz sonunda depolandığında şifrelenir, ancak bu gerçekleşene kadar, şifrenizi girdiğiniz araç elbette doğrudan erişebilir, başka bir program STDIN'den okurken klavyenizde girdiğiniz öğelere erişebilir.

Bu, aracın arka planda kullanılan PAM sisteminin bir özelliğidir passwd. PAM, modern Linux dağıtımları tarafından kullanılır.

Daha spesifik olarak, pam_cracklibPAM için, onları çok savunmasız bırakacak çeşitli zayıflıklara dayanarak şifreleri reddetmeye izin veren bir modüldür.

Güvensiz olarak kabul edilebilecek yalnızca benzer şifreler değil. Kaynak kodu bir şifre bir palindrom ya da ne düzenlemek mesafesi iki kelime arasında olup olmadığı örneğin kontrol edilebilir ne çeşitli örnekler vardır. Fikir, sözlük saldırılarına karşı şifreleri daha dayanıklı hale getirmektir.

Ayrıca bkz manpage.pam_cracklib


açıklamanızın cevabımda bildirilen tartışmalara uyduğu konusunda “fikriniz” var mı? Ev sahibi PAM farkında değilken "passwd" uygulaması tarafından alınan iki farklı yaklaşım var mı? Not: Hiç eleştirmen yok. Merak ediyorum (PAM olarak, BTW, benim ilk tahminimdi ... kaynak kodu vermeden önce).
Damiano Verzulli,

27
Daha rahatsız edici olan, son dörtten herhangi biri arasında aynı veya benzer şifreyi kullandığınızda sizi uyaran kurumsal şifre kurallarıdır.
Nick T,

4
@NickT Bu (zorunlu olarak) ne kadar rahatsız edicidir - son 4 karınızı kurtarmazlarsa, her birini önerilen soru ile aynı şekilde karşılaştırır mıydınız?
neminem,

1
@neminem "... veya benzerleri"
Nick T

1
@NickT Ah, yeterince adil, çünkü bu özel durumda, şifreyi değiştirmek için kullanıcının kaydettiği hash ile değil, kullanıcının girdiği "eski şifre" ile karşılaştırıyorsunuz. Yine de, olabilir varsayımsal en azından gerçekten basit değişiklikler kontrol etmek için, BWG bir yorum yayınlanmıştır yöntemi kullanmak (bir karakter ikamesi, bir karakter, vb eklendi / kaldırıldı).
neminem

46

En azından Ubuntu'mda "çok benzer" mesajlar çıktı ne zaman: "... karakterlerin yarısından fazlası farklı olanlar ...." (ayrıntılar için aşağıya bakın). PAM desteği sayesinde, slhck cevabında açıkça belirtildiği gibi.

PAM'ın kullanılmadığı diğer platformlarda, "çok benzer" mesajlar şu durumlarda ortaya çıkar: "... karakterlerin yarısından fazlası farklı olanlar ..." (ayrıntılar için aşağıya bakın)

Bu açıklamayı kendi başınıza kontrol etmek için kaynak kodunu kontrol etmek mümkündür. İşte nasıl.

"Passwd" programı passwd paketine dahil edilmiştir:

verzulli@iMac:~$ which passwd
/usr/bin/passwd
verzulli@iMac:~$ dpkg -S /usr/bin/passwd
passwd: /usr/bin/passwd

Açık Kaynak teknolojileriyle uğraşırken, kaynak koduna sınırsız erişimimiz var. Bunu almak, basittir:

verzulli@iMac:/usr/local/src/passwd$ apt-get source passwd

Daha sonra ilgili kod parçasını bulmak kolaydır:

verzulli@iMac:/usr/local/src/passwd$ grep -i -r 'too similar' .
[...]
./shadow-4.1.5.1/NEWS:- new password is not "too similar" if it is long enough
./shadow-4.1.5.1/libmisc/obscure.c:     msg = _("too similar");

"Obscure.c" nin hızlıca kontrol edilmesi şunu verir: (sadece ilgili kod parçasını kesip yapıyorum):

static const char *password_check (
    const char *old,
    const char *new,
    const struct passwd *pwdp)
{
    const char *msg = NULL;
    char *oldmono, *newmono, *wrapped;

    if (strcmp (new, old) == 0) {
            return _("no change");
    }
    [...]
    if (palindrome (oldmono, newmono)) {
            msg = _("a palindrome");
    } else if (strcmp (oldmono, newmono) == 0) {
            msg = _("case changes only");
    } else if (similar (oldmono, newmono)) {
            msg = _("too similar");
    } else if (simple (old, new)) {
            msg = _("too simple");
    } else if (strstr (wrapped, newmono) != NULL) {
            msg = _("rotated");
    } else {
    }
    [...]
    return msg;
}

Öyleyse, şimdi, her ikisinin de benzer olup olmadığına bakılmaksızın eskiye ve yenisine dayanan "benzer" bir işlev olduğunu biliyoruz. İşte pasajı:

/*
 * more than half of the characters are different ones.
 */
static bool similar (const char *old, const char *new)
{
    int i, j;

    /*
     * XXX - sometimes this fails when changing from a simple password
     * to a really long one (MD5).  For now, I just return success if
     * the new password is long enough.  Please feel free to suggest
     * something better...  --marekm
     */
    if (strlen (new) >= 8) {
            return false;
    }

    for (i = j = 0; ('\0' != new[i]) && ('\0' != old[i]); i++) {
            if (strchr (new, old[i]) != NULL) {
                    j++;
            }
    }

    if (i >= j * 2) {
            return false;
    }

    return true;
}

C kodunu incelemedim. Fonksiyon tanımından hemen önce açıklamaya güvenmem konusunda kendimi sınırladım :-)


PAM ve NAM-PAM bilinmeyen platformlar arasındaki fark, aşağıdaki gibi yapılandırılmış olan "obscure.c" dosyasında tanımlanmıştır:

#include <config.h>
#ifndef USE_PAM
[...lots of things, including all the above...]
#else                           /* !USE_PAM */
extern int errno;               /* warning: ANSI C forbids an empty source file */
#endif                          /* !USE_PAM */

9
Bu uzun bir cevap, şifreleri karma olduğu zaman eski şifreyle nasıl karşılaştırabileceği sorusunu doğrudan cevaplamıyor gibi görünüyor.
jamesdlin

10
@jamesdlin: Orijinal soruya Rinzwind açıklamada belirtildiği gibi karmaları do DEĞİL bu konuda herhangi bir rol oynamaktadır: Şifreyi değiştirmek için "passwd" komutunu kesilirken, "eski" ve "yeni" parola hem iletmeniz gerekir. Bu nedenle, "passwd" kodunun her iki parolayı bir kerede karşılaştırma / kontrol etmede hiçbir problemi yoktur (net formlarda; net değil).
Damiano Verzulli,

3
@DamianoVerzulli Bununla birlikte, bu gerçekten soruyu ele almaz. Soru, "iki dizginin benzer olup olmadığını söylemek için hangi C kodunu kullanıyorsunuz?" Değildi. Bu, şifreler için tamamen başka bir şeyde olduğu gibi aynı. Şifreler hakkında onları ilginç kılan şey , asla düz metin içinde saklanmadıkları ve sorulanın sorduğu şey bu. Bu, "hangi kriterlerin kullanıldığını ve C'de nasıl yapıldığını" yanıtlar, ancak "hangi kriterlerin" ve "C'de bunu nasıl yapacağım" için çok uzun bir SÖ sorusudur, SU sorusudur.
Aralık'ta

7
@DamianoVerzulli passwdHem eski hem de yeni şifreler soran aslında cevaptır . Bu cevabın geri kalanı ilgisizdir.
jamesdlin

3
+1 ve son derece alakalı ve ilginç bir cevap! Gerçek kod karşılaştırma şifresini gerçekten düz metin üzerinde ve beklendiği gibi karma üzerinde çalışmadığını görmek güzel.
nico

36

Cevap sandığınızdan çok daha basit. Aslında, neredeyse sihir olarak nitelendirilir, çünkü bir kez hileyi açıklarsanız, gider:

$ passwd
Current Password:
New Password:
Repeat New Password:

Password changed successfully

Yeni şifrenizin benzer olduğunu biliyor ... Çünkü eski şifreyi biraz önce yazdınız.


2
"... ya da şeker."
Nick T,

1
Aptal tavşan, üçlü çocuklar içindir!
14'te

1
Açıklayamadığı şey, geçmiş n şifrelerinizi bildiği zamandır :) "Aynı şifrelerin şirket ortamında değiştirilmesini engelleyen" Şifre çok yeni kullanılmıştı ".
Juha Untinen,

3
@Juha Untinen: Bu doğru, ancak son N karma değerlerini hatırlayarak idare edilebilir. "Nth şifre ile aynı" yakalamak kolaydır, " Nth şifre ile benzer " zor. Bildiğim kadarıyla, bu sistemler sadece son parola ile benzerliği kontrol ediyor ve son N ile aynılığı kontrol ediyorlar. Son N ile benzerliği kontrol ediyorlarsa, bu gerçekten ilginç bir numara değil mi? Bunu nasıl yaptıkları hakkında hiçbir fikrim yok.
Cort Ammon

7

Diğer cevaplar doğru olsa da, bunun çalışması için eski şifreyi girmeniz gerekmediğinden bahsetmeye değer olabilir!

Aslında, sağladığınız yeni şifreye benzer bir grup şifre oluşturabilir, şifrelerini değiştirebilir ve ardından bu karma değerlerden herhangi birinin eskisine uygun olup olmadığını kontrol edebilirsiniz. Bu durumda, yeni şifre eskisine benzer şekilde değerlendirilir! :)


2
Bu gerçekten de bu başarıya ulaşmak için bir araç olsa da (ve birçok web sitesi tarafından kullanılıyor), bu durumda olan şey bu değil.
Brian S

Bu temiz bir numara! Biraz da hesaplama açısından daha yoğun, ama zekice!
Cort Ammon

En azından anlamlı bir kontrol veya harici bir kaynağa bağlanmak için kaç tane benzer şifrenin oluşturulması gerektiğine dair bir tahmin vermelisiniz. Aksi halde, bu sadece olası bir fikirdir, doğrulanmış bir cevap değildir.
Hyde

Birisinin aklına gelebilecek kriterlere bağlı @hyde. Benim için şifreler benzer / eklenmiş / kaldırılmış / değiştirilmiş en fazla 3 karakter varsa benzerdir. Yani her karakter için 62 karma (ve sadece alfasayısal kullanıyorsak) şifrenin uzunluğundan 3 olan kombinasyonun ( n), yani 62 * (n!)/(6 * (n - 3)!)12 karakterlik parola için 13540'a eşittir. Fakat eğer biri farklı bir şey düşünürse, denklem faydasızdır, peki neden rahatsız ediyorsun?
Killah

Aptal cevap, ama yine de bir içgörü. Neden aptal? 1. Hayal edilemeyecek sayıda karma üretmek zorundasınız. 2. Böyle bir kurulum, orijinal şifrenin güvenliğini zayıflatacaktır. Biri sadece bir karma yerine tüm benzer şifrelerden karma elde ederse, kırması daha kolay olur.
Rok Kralj

5

Bir yönü ele alınmadı: şifre geçmişi. Bazı sistemler bunu destekliyor. Bunu yapmak için, parolaların geçmişini tutar ve bunları geçerli parola ile şifreler. Şifrenizi değiştirdiğinizde, listenin şifresini çözmek ve doğrulamak için "eski" şifreyi kullanır. Ve yeni bir şifre belirlediğinde, yeni şifreden türetilen bir anahtarla şifrelenmiş listeyi (tekrar) kaydeder.

remember=NPAM'de böyle çalışır (saklanır /etc/security/opasswd). Ancak, Windows ve diğer Unix satıcıları da benzer işlevler sunar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.