মাইএসকিউএল এ SHA1 হ্যাশ মান সংরক্ষণ করে


160

আমার একটি সাধারণ প্রশ্ন রয়েছে যখন আমার কোনও এসএইচএল হ্যাশের ফলাফল কোনও মাইএসকিউএল ডাটাবেসে সংরক্ষণ করতে চাইলে এমনটি ঘটেছিল:

আমি হ্যাশটির ফলাফল সংরক্ষণ করি যেখানে ভর্চারের ক্ষেত্রটি আর কতদিন হওয়া উচিত ?


9
যদি আপনি কেবল শেগল ক্লিক করেন তবে আমি ভাগ্যবান বোধ করছি এবং আপনার উইকিপিডিয়ায় থাকা উচিত যেখানে আপনি এটি সর্বদা 160 বিট পেতে পারেন।
টিম ম্যাথিউজ

উত্তর:


315

আমি VARCHARপরিবর্তনশীল দৈর্ঘ্যের ডেটার জন্য ব্যবহার করব তবে স্থির দৈর্ঘ্যের ডেটা নয়। যেহেতু একটি SHA-1 মান সর্বদা 160 বিট লম্বা হয়, তবে স্থির দৈর্ঘ্যের ক্ষেত্রের দৈর্ঘ্যের জন্যVARCHAR কেবল একটি অতিরিক্ত বাইট নষ্ট করবে ।

এবং আমি মানটি SHA1ফিরিয়ে আনব না returning কারণ এটি প্রতি চরিত্রের জন্য মাত্র 4 বিট ব্যবহার করে এবং এর জন্য 160/4 = 40 টি অক্ষর প্রয়োজন। তবে আপনি যদি প্রতি চরিত্রে 8 বিট ব্যবহার করেন তবে আপনার কেবল 160/8 = 20 অক্ষরের দীর্ঘ ক্ষেত্রের প্রয়োজন হবে।

সুতরাং আমি আপনাকে ব্যবহার BINARY(20)এবং UNHEXফাংশনটিSHA1 বাইনারি রূপান্তর করতে ফাংশন প্রস্তাব ।

আমি BINARY(20)এবং এর জন্য স্টোরেজ প্রয়োজনীয়তার তুলনা করেছি 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
);

মিলিয়ন রেকর্ডের সাথে binary(20)44.56M লাগে, যখন char(40)লাগে 64.57M। InnoDBইঞ্জিন।


2
PostgreSQL এ, এটি বাইটিয়া ক্ষেত্রটি ব্যবহার করে অনুবাদ করবে, ঠিক আছে?
mvexel

সমাধানটি দুর্দান্ত, তবে হেক্সড শে 1 সহ চর (40) ব্যবহার করার আরও একটি বিষয় রয়েছে - এটি অনেক বেশি ব্যবহৃত হয়, এবং কোনও অ্যাপ্লিকেশন কোডে রূপান্তর সংক্রান্ত সমস্যা কম থাকবে will
আর্থার কুশমান

2
Phpmyadmin ব্যবহারকারীদের জন্য নোট। বাইনারি হিসাবে হ্যাশ সংরক্ষণ করার সময়, phpmyadmin এটিকে হেক্স স্ট্রিং হিসাবে প্রদর্শন করবে, কিন্তু পিএমএ এটি সরবরাহিত "অনুসন্ধান ট্যাবে" ব্যবহার করতে অক্ষম হবে। UNHEX()ম্যানুয়ালি স্কয়ারে যুক্ত করলেই কাজ করবে ।
টিমো হুভিনেন

2
@ গম্বো আপনি বাইটায় একটি পরিবর্তনশীল সংখ্যক বাইট সঞ্চয় করতে পারেন। আপনি বাইটিয়া ধরণের স্টোরেজ প্রয়োজনীয়তার কথা উল্লেখ করছেন। যা "1 বা 4 বাইট প্লাস প্রকৃত বাইনারি স্ট্রিং"। "1 বা 4" যা বোঝায় তা হ'ল সঞ্চিত ডেটার দৈর্ঘ্য হতে পারে, যেহেতু আপনি বার্চের সাথে স্ট্রিংটি শেষ করতে শূন্য বাইট ব্যবহার করতে পারবেন না। এটি বোঝানো হয়েছে, তবে ম্যানুয়ালটিতে বলা হয়নি, আপনি বাইটায় 2 2 (8 * 4) বা 4+ গিগা বাইট সংরক্ষণ করতে পারেন। postgresql.org/docs/9.0/static/datatype-binary.html একটি পোস্টগ্র্যাস ডাটাবেসে হ্যাশ সংরক্ষণ করা সম্ভবত কিছুটা বা বাইটিয়া কলামের চেয়ে ছোট হবে ।
ভিক্টর

2
dev.mysql.com/doc/refman/5.5/en/… ক্রিপ্ট ফাংশনগুলির ফলাফল সংরক্ষণের সময় কর্মক্ষমতা এবং স্টোরেজ সম্পর্কিত তথ্য সরবরাহ করে
ক্লোকার


11

রেফারেন্স এই ব্লগ থেকে নেওয়া:

নীচে হ্যাশিং অ্যালগরিদম এর প্রয়োজনীয় বিট আকারের একটি তালিকা রয়েছে:

  • MD5 = 128-বিট হ্যাশ মান।
  • SHA1 = 160-বিট হ্যাশ মান।
  • SHA224 = 224-বিট হ্যাশ মান।
  • SHA256 = 256-বিট হ্যাশ মান।
  • SHA384 = 384-বিট হ্যাশ মান।
  • SHA512 = 512-বিট হ্যাশ মান।

প্রয়োজনীয় CHAR (এন) সহ একটি নমুনা সারণী তৈরি করা হয়েছে:

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
দয়া করে , দয়া করে দয়া করে এটির মতো পাসওয়ার্ডগুলি সংরক্ষণ করবেন না।
বেরি এম

আরে বেরি, তুমি কেন বোঝাতে পারো? বিশদ বিবরণে
আনवेश

4
পাসওয়ার্ডগুলির সহজ হ্যাশগুলি সংরক্ষণ করে পাসওয়ার্ডগুলিকে "এক্সট্রাক্ট" করা অনেক সহজ করে তোলে যদি আপনার লবণাক্ত (আশা করি প্রসারিত) পাসওয়ার্ড হ্যাশ ব্যবহার করার চেয়ে আপনার ডাটাবেস আপস করা হয়। প্রস্তাবিত পাঠ্য: প্যারাগনি
ম্যাট

2
@BerryM। এটি এক বছর পরে পড়া, এবং কোনও সেকেন্ডের জন্য ভাবেন নি যে কেউ পাসওয়ার্ডের বিষয়ে কথা বলছে বা যদি লোকেরা এখনও ডেথ ডেটা সঞ্চয় করতে সাধারণ হ্যাশ ব্যবহার করে। তবে তারা করেন: ডি
রোহিত হাজরা

6

Sha1 এর আউটপুট আকার 160 বিট। যা 160/8 == 20 টি অক্ষর (যদি আপনি 8-বিট অক্ষর ব্যবহার করেন) বা 160/16 = 10 (আপনি যদি 16-বিট অক্ষর ব্যবহার করেন)।


8-বিট বাইনারি অক্ষর ধরে নেওয়া। হেক্স হিসাবে সংরক্ষণ করা হলে 40 টি অক্ষর।
টাইজয়েড

3

সুতরাং দৈর্ঘ্য 10 16-বিট অক্ষর এবং 40 হেক্স অঙ্কের মধ্যে is

যে কোনও ক্ষেত্রে আপনি যে ফর্ম্যাটটি সঞ্চয় করতে যাচ্ছেন তা স্থির করুন এবং সেই বিন্যাসের ভিত্তিতে ক্ষেত্রটিকে একটি নির্দিষ্ট আকার করুন make এইভাবে আপনার কোনও নষ্ট স্থান থাকবে না।


2

আপনি এখনও ব্যবহারকারীদের জন্য হ্যাশ সর্বদা সংরক্ষণ না করে (যেমন অ্যাকাউন্টগুলি প্রমাণীকরণ / লগইন ইউআরএল ভুলে গেছেন) সেই ক্ষেত্রেও উইচারআর ব্যবহার করতে পারেন। একবার কোনও ব্যবহারকারী তাদের লগইন তথ্যকে প্রমাণীকরণ / পরিবর্তন করে ফেললে তারা হ্যাশ ব্যবহার করতে সক্ষম হবে না এবং এর কোনও কারণ নেই should অস্থায়ী হ্যাশ -> ব্যবহারকারী সংঘগুলি মুছতে পারে এমন সংরক্ষণের জন্য আপনি একটি পৃথক টেবিল তৈরি করতে পারেন তবে আমার মনে হয় না বেশিরভাগ লোকেরা এটি করতে বিরক্ত করে।


2

আপনার যদি sha1 কলামে একটি সূচি প্রয়োজন হয়, আমি পারফরম্যান্স কারণে CHAR (40) প্রস্তাব করি। আমার ক্ষেত্রে sha1 কলামটি একটি ইমেল নিশ্চিতকরণ টোকেন তাই ল্যান্ডিং পৃষ্ঠায় কোয়েরিটি কেবল টোকেন দিয়ে প্রবেশ করে। এক্ষেত্রে আমার মতে আইএনডেক্সের সাথে চার (40) হ'ল সেরা পছন্দ :)

আপনি যদি এই পদ্ধতিটি অবলম্বন করতে চান তবে মনে রাখবেন $ কাঁচা_আউটপুট = মিথ্যা।


1
কেন আপনি বিনয়ের (20) সূচক করবেন না? এটি কি আকারের মতো তত দ্রুত এবং অর্ধেক বড় হবে না?
নিকডনক

ভাল এই this 5 বছর পূর্বে কিন্তু আমি মনে করি যে আমি এখনও এই সত্যটি উল্লেখ করছি যে আপনাকে এখনও আনহেক্স করা দরকার যা কিছু বোঝা যুক্ত করে (+ অ্যাপ্লিকেশনটি বজায় রাখা আরও কঠিন এবং কম বহনযোগ্য?)। এটি আপনার হার্ডওয়ারের উপরও নির্ভর করে, যদি আপনি কম স্টোরেজ পেয়ে থাকেন এবং বাইনারি (20) এর সাথে আঁকেন তবে এটি ধীরে ধীরে ভাল হয় অন্যথায় আমি চর (40) বলতে পারি। আপনি যে ভাষাটি এবং হার্ডওয়্যারটি ব্যবহার করছেন তা নিয়ে কিছু পরীক্ষা না চালিয়ে বলা শক্ত এবং আপনার পক্ষে সবচেয়ে উপযুক্ত কি তা দেখুন।
ফ্রান্সেস্কো ক্যাসুলা

1
আমি মনে করি আপনি যদি একক সারিতে আনহেক্স (হ্যাশ) = হ্যাশ নির্বাচন করা ব্যতীত অন্য কিছু করছেন তবে সম্ভবত আপনি ঠিক বলেছেন। তবে সূচকে বাফার রাখতে এইভাবে দ্বিগুণ মেমরি লাগবে।
নিকডনক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.