看這個很基本的C程序:爲什麼鹽被包含在用C crypt函數哈希
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <crypt.h>
int main (int argc, char *argv[])
{
char pid[16];
int id;
for (id = 0; id < 100; id++)
{
snprintf(pid, sizeof(pid), "%i", id);
printf("%s %s\n",pid, crypt(pid, "$1$awesome"));
}
}
這裏是Linux系統上的輸出:
0 $1$awesome$cVjo4Ue9HeJs7sStMTm6v.
1 $1$awesome$6.658tD5uVqwQJ6/S8Mc71
2 $1$awesome$bKavcHTWRGnlTgP.zTZhO.
3 $1$awesome$ZlBH.fgxGrfw/naq38hyv.
4 $1$awesome$aQCliN7gPud1PC07Vri.y1
5 $1$awesome$EewcRVU39I/n0uMGaDxCN0
6 $1$awesome$fKMRDZaa5wra4G8xy9.m0/
7 $1$awesome$AqJ0SmXImg.xcUg/Yh/ov.
8 $1$awesome$bT3Wq9QORw1dnNZFZmVBk.
9 $1$awesome$4uM8mfZGdj2zeZ/CP/GSz1
10 $1$awesome$Gsa/ilcFg1LRl2dqNhgXg0
我不明白爲什麼鹽在輸出中可見。 我試圖在Mac OS X上編譯相同的程序,但沒有看到散列中的鹽。 這不是一個安全漏洞嗎?我們不應該在哈希中清楚地看到鹽?
感謝
不,這不是安全漏洞。您需要存儲鹽以便能夠散列下一個輸入並進行比較。鹽的目的是迫使攻擊者單獨處理每個密碼,而不是一個祕密。你用同樣的鹽來解決這個問題。它應該是隨機的。見例如https://security.stackexchange.com/questions/51959/why-are-salted-hashes-more-secure-for-password-storage – jonrsharpe
一種重要的注意:'crypt'功能是不是C標準的一部分。它是[POSIX標準]的一部分(http://pubs.opengroup.org/onlinepubs/9699919799/functions/crypt.html)。 –
鹽不** **不必須保持祕密見:[隱藏鹽的哈希的必要性(https://stackoverflow.com/questions/213380/the-necessity-of-hiding-the-鹽換一個散列)。 –