2010-09-29 15 views
5

के साथ बाइट सरणी के रूप में हैश को संग्रहीत करना User इकाई वर्ग में पासवर्ड हैश फ़ील्ड है, जो एक निश्चित लंबाई के साथ एक बाइट सरणी है (32 क्योंकि यह एक SHA-256 हैश है)।जेपीए

@Entity 
public class User { 
    @Column(nullable=false) 
    private byte[] passwordHash; 
    ... 
} 

जैसा कि आप देख सकते हैं, मैंने इसे किसी विशेष चीज़ के साथ एनोटेट नहीं किया है, सिर्फ एक न्यूल।

यह काम करता है, लेकिन यह प्रदर्शन करेंगे? मेरा स्कीमा हाइबरनेट द्वारा उत्पन्न होता है, लेकिन मुझे नहीं पता कि यह वास्तव में क्या उत्पन्न करता है (मैं वर्तमान में एक इन-मेमोरी एचएसक्यूएल डेटाबेस का उपयोग कर रहा हूं)।

मैं चिंतित हूं कि, के बाद से यह पता नहीं है कि यह एक निश्चित लंबाई सरणी (Column एनोटेशन के length क्षेत्र केवल तार पर लागू होता है), यह एक ब्लॉब क्षेत्र है जिसमें जोड़ा जाता है में इस हैश स्टोर करेगा है कर रहा हूँ एक सूचक के रूप में रिकॉर्ड करें (अगर मैं सही ढंग से समझता हूं कि डाटाबेस कैसे काम करते हैं)।

क्या यह सच है, और मैं यह कैसे बदल सकते हैं? क्या मुझे बेस 64 या हेक्स के साथ हैश को एक स्ट्रिंग के रूप में एन्कोड करना चाहिए, उसमें छोटे प्रदर्शन/शुद्धता प्रभाव को स्वीकार करना चाहिए?

+0

क्यों आप इसे वास्तविक लक्ष्य डेटाबेस के साथ की कोशिश नहीं करते हैं, और देखो यह क्या उत्पन्न करता है? – skaffman

+0

@ स्काफमैन: मैंने डेटाबेस को MySQL में बदल दिया है और यह एक TINYBLOB कॉलम –

+0

उत्पन्न करता है जो मुझे चाहिए BINARY (32) –

उत्तर

1

tinyblob एक अच्छा जॉयस (mysql types reference) है, लेकिन मेरे सभी क्षुधा स्ट्रिंग्स के साथ ठीक काम करते हैं। यदि आप वास्तव में परवाह मिली-सेकंड के बारे में प्रोफाइलर में दोनों संस्करणों कोशिश करते हैं और देखते हैं कि क्या सबसे अच्छा काम करता है। मेरा पसंदीदा प्रोफाइलर नेटबीन में शामिल है।

0

जहाँ तक मुझे पता है, एक SHA-256 हैश हमेशा केवल प्रिंट करने योग्य पात्रों है (और अगर नहीं, तो यह बेस 64 सांकेतिक शब्दों में बदलना), तो समाधान है कि आप इसे स्ट्रिंग के रूप में स्टोर कर सकते हैं, तो Column की length क्षेत्र का उपयोग करें एनोटेशन।

तो फिर आप अपने निर्धारित लंबाई और प्रदर्शन के बारे में कोई संदेह नहीं है मिल गया है।

+0

नहीं, मैंने आउटपुट देखा है और इसमें वास्तव में अधिकतर अनपेक्षित वर्ण होते हैं (या बल्कि चरित्र डेटा नहीं है)। मैं निश्चित रूप से बेस 64 या हेक्स एन्कोड कर सकता था, लेकिन अगर मैं इसे शुद्ध बाइनरी रूप में स्टोर कर सकता हूं, तो यह अच्छा होगा। –

5

मैं चिंतित हूं कि, के बाद से यह पता नहीं है कि यह एक निश्चित लंबाई सरणी (स्तंभ एनोटेशन केवल तार पर लागू होता है की लंबाई क्षेत्र) है हूँ, (...)

हैं आप कॉलम की लंबाई निर्दिष्ट करते हैं, हाइबरनेट इस जानकारी का उपयोग SQL कॉलम प्रकार को उत्पन्न करने के लिए करेगा (TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB) हालांकि।

मैं क्या जरूरत है बायनरी (32)

आप इस कोशिश की है?

@Column(columnDefinition="BINARY(32) NOT NULL") 
private byte[] passwordHash; 
0

यह रूप में कुशल नहीं हो सकता है, लेकिन मैं आपको भंडारण प्रकार के रूप में स्ट्रिंग का उपयोग करें और के रूप में मनुष्य और सेटर तरीके के साथ की जरूरत का अनुवाद सुझाव देते हैं। यह विभिन्न डेटाबेस के बीच जेपीए के लिए अधिकतम पोर्टेबिलिटी की अनुमति देता है।

मैं यूटीसी में युग के बाद से समय का प्रतिनिधित्व करने वाले लंबे समय तक संग्रहीत करके दिनांक/समय के साथ एक समान तकनीक का उपयोग करता हूं जो मुझे टाइमज़ोन मुद्दों से बचने की अनुमति देता है (टाइमज़ोन जानकारी सभी डेटाबेस में डेटाबेस तिथियों में पोर्टेबल नहीं है)।