SHA1 karma değerlerini MySQL'de depolama


160

Bir MySQL veritabanında bir SHA1 karma sonucu saklamak istediğinde oluşan basit bir soru var:

Karma sonucunu sakladığım VARCHAR alanı ne kadar olmalıdır ?


9
Sadece googled sha1 click im şanslı hissediyorum ve her zaman 160 bit olduğunu bulabilirsiniz wikipedia üzerinde olmalıdır.
Tim Matthews

Yanıtlar:


315

VARCHARDeğişken uzunluklu veriler için kullanırım , ancak sabit uzunluklu verilerle kullanmam. SHA-1 değeri olduğu için , her zaman 160 bit uzunluğunda, VARCHARsadece israf sabit uzunluklu alan uzunluğu için ek bir bayt .

Ve ben de SHA1dönen değeri saklamak olmaz . Çünkü karakter başına sadece 4 bit kullanır ve bu nedenle 160/4 = 40 karaktere ihtiyaç duyar. Ancak karakter başına 8 bit kullanırsanız, yalnızca 160/8 = 20 karakter uzunluğunda bir alana ihtiyacınız olur.

Ben tavsiye Yani kullanmak BINARY(20)ve UNHEXfonksiyon dönüştürmek için SHA1ikili değer.

Ben depolama gereksinimleri karşılaştırıldı BINARY(20)ve CHAR(40).

CREATE TABLE `binary` (
    `id` int unsigned auto_increment primary key,
    `password` binary(20) not null
);
CREATE TABLE `char` (
    `id` int unsigned auto_increment primary key,
    `password` char(40) not null
);

Milyon binary(20)kayıtla 44.56M, char(40)64.57M alır. InnoDBmotor.


2
PostgreSQL'de, bu bytea alanı kullanmaya dönüşür, değil mi?
mvexel

Çözüm harika, ancak altıgen sha1 ile char (40) kullanmak için başka bir nokta var - bu çok daha yaygın olarak kullanılıyor ve bir uygulama kodunda daha az dönüştürme sorunu olacak.
Arthur Kushman

2
Phpmyadmin kullanıcıları için not. Karma ikili olarak saklanırken, phpmyadmin bunu bir onaltılı dize olarak görüntüler, ancak pma sağlanan "arama sekmesinde" kullanamaz. Yalnızca UNHEX()el ile sql eklerseniz çalışır .
Timo Huovinen

2
@Gumbo Bir baytta değişken sayıda bayt saklayabilirsiniz. Bytea tipinin depolama gereksinimlerine atıfta bulunuyorsunuz. Hangi "1 veya 4 bayt artı gerçek ikili dize" dir. "1 veya 4" ün ifade ettiği şey, varchar ile yaptığınız gibi dizeyi bitirmek için sıfır bayt kullanamayacağınız için depolanan verilerin uzunluğu olabilir. Bu, kılavuzda belirtilmemiş, ancak bir bytea'da en fazla 2 ^ (8 * 4) veya 4+ gigabayt depolayabileceğiniz anlamına gelir. postgresql.org/docs/9.0/static/datatype-binary.html Karmayı bir postgres veritabanında depolamak, muhtemelen bir bit veya bytea sütunu kadar küçük olacaktır .
Viktor

2
dev.mysql.com/doc/refman/5.5/en/... kript fonksiyonların sonuçları saklarken performans ve depolama hakkında bilgi sağlamaktadır
Clocker


11

Bu blogdan alınan referans:

Aşağıda, bit büyüklüğü ile birlikte karma algoritmanın bir listesi bulunmaktadır:

  • MD5 = 128 bit karma değeri.
  • SHA1 = 160 bit karma değeri.
  • SHA224 = 224 bit karma değeri.
  • SHA256 = 256 bit karma değeri.
  • SHA384 = 384 bit karma değeri.
  • SHA512 = 512 bit karma değeri.

CHAR (n) gerektiren bir örnek tablo oluşturuldu:

CREATE TABLE tbl_PasswordDataType
(
    ID INTEGER
    ,MD5_128_bit CHAR(32)
    ,SHA_160_bit CHAR(40)
    ,SHA_224_bit CHAR(56)
    ,SHA_256_bit CHAR(64)
    ,SHA_384_bit CHAR(96)
    ,SHA_512_bit CHAR(128)
); 
INSERT INTO tbl_PasswordDataType
VALUES 
(
    1
    ,MD5('SamplePass_WithAddedSalt')
    ,SHA1('SamplePass_WithAddedSalt')
    ,SHA2('SamplePass_WithAddedSalt',224)
    ,SHA2('SamplePass_WithAddedSalt',256)
    ,SHA2('SamplePass_WithAddedSalt',384)
    ,SHA2('SamplePass_WithAddedSalt',512)
);

10
Lütfen, lütfen , lütfen böyle şifreleri saklamayın.
Berry M.

Hey berry, NEDENİ açıklayabilir misin? detaylar
Anvesh

4
Basit parola karmaları depolamak, veritabanınızın güvenliği ihlal edilmişse, parolaların tuzlanmış (umarım gergin) bir parola karması kullanmanıza göre "ayıklanmasını" kolaylaştırır. Önerilen okuma: paragonie.com/blog/2016/02/how-safely-store-password-in-2016
matt

2
@BerryM. bunu bir yıl sonra okudum ve kimsenin şifreler hakkında konuştuğunu veya insanların hala kimlik doğrulama verilerini saklamak için basit karma kullandığını düşünmedim. Ama yaparlar: D
Rohit Hazra

6

Shal'in çıktı boyutu 160 bittir. Hangi 160/8 == 20 karakterdir (8 bit karakter kullanırsanız) veya 160/16 = 10 (16 bit karakter kullanırsanız).


8 bitlik ikili karakterler varsayıldığında. Onaltılık olarak depolandıysa 40 karakter.
Tyzoid

3

Yani uzunluk 10 16 bit karakter ile 40 onaltılık basamak arasındadır.

Her durumda saklayacağınız biçime karar verin ve alanı bu biçime göre sabit bir boyut yapın. Bu şekilde boşa giden bir alan kalmaz.


2

Kullanıcı için her zaman bir karma saklamadığınız durumlarda VARCHAR'ı kullanmak isteyebilirsiniz (örneğin, kimlik doğrulama / giriş URL'sini unuttum). Kullanıcı giriş bilgilerini doğruladıktan / değiştirdikten sonra karmayı kullanamamalı ve bunun için bir neden olmamalıdır. Silinebilecek geçici karma -> kullanıcı ilişkilendirmelerini saklamak için ayrı bir tablo oluşturabilirsiniz, ancak çoğu insanın bunu yapmaktan rahatsız olduğunu düşünmüyorum.


2

Sha1 sütununda bir dizine ihtiyacınız varsa, performans nedenleriyle CHAR (40) öneririm. Benim durumumda sha1 sütunu bir e-posta onay jetonudur, bu nedenle açılış sayfasında sorgu yalnızca jetonla girilir. Bu durumda, INDEX ile CHAR (40), bence, en iyi seçimdir :)

Bu yöntemi uygulamak istiyorsanız, $ raw_output = false komutunu bırakmayı unutmayın.


1
Neden İKİLİ (20) 'yi endekslemesiniz? Bu kadar hızlı ve yarısı kadar büyük olmaz mıydı?
nickdnk

Peki bu ~ 5 yıl önce ama ben hala biraz yük ekleyen unhex gerekir (+ uygulamayı korumak ve daha az taşınabilir hale getirir?) Gerçeğine atıfta olduğunu düşünüyorum. Daha az depolama alanınız varsa, muhtemelen donanımınıza da bağlıdır ve muhtemelen ikili (20) 'ye yapışmak en iyisidir, aksi takdirde char (40) diyebilirim. Kullanacağınız dil ve donanım ile bazı testler yapmadan söylemek ve size en uygun olanı görmek zor.
Francesco Casula

1
Sanırım tek bir satır getirmek için unhex (hash) = karma seçmek dışında bir şey yapıyorsanız, o zaman belki haklısınız. Ancak dizinin arabelleğe alınması bu şekilde iki kat daha fazla bellek alacaktır.
nickdnk
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.