पासवर्ड से कुंजी उत्पन्न करने के लिए RFC2898 का उपयोग करें। यह जेआरई या जेसीई में शामिल नहीं है, जहां तक मुझे पता है, लेकिन यह जे 2 ईई सर्वर जैसे JBoss, ओरेकल, और WebSphere में शामिल है। इसे .NET बेस क्लास लाइब्रेरी (Rfc2898DeriveBytes) में भी शामिल किया गया है।
जावा में कुछ एलजीपीएल कार्यान्वयन हैं, लेकिन एक त्वरित रूप से this one जटिल पर थोड़ा सा दिखता है। एक अच्छा javascript version भी है। (मैंने a modified version of that one का उत्पादन किया और इसे विंडोज स्क्रिप्ट घटक के रूप में पैक किया)
उपयुक्त लाइसेंस के साथ एक अच्छा कार्यान्वयन की कमी, मैंने मैटियास गार्टनर से कुछ कोड पैक किए। यह कोड पूरी तरह से है। समझने में आसान, सरल, सरल। इसे MS Public License के तहत लाइसेंस प्राप्त है।
// PBKDF2.java
// ------------------------------------------------------------------
//
// RFC2898 PBKDF2 in Java. The RFC2898 defines a standard algorithm for
// deriving key bytes from a text password. This is sometimes
// abbreviated "PBKDF2", for Password-based key derivation function #2.
//
// There's no RFC2898-compliant PBKDF2 function in the JRE, as far as I
// know, but it is available in many J2EE runtimes, including those from
// JBoss, IBM, and Oracle.
//
// It's fairly simple to implement, so here it is.
//
// Created Sun Aug 09 01:06:57 2009
//
// last saved:
// Time-stamp: <2009-August-09 02:19:50>
// ------------------------------------------------------------------
//
// code thanks to Matthias Gartner
//
// ------------------------------------------------------------------
package cheeso.examples;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class PBKDF2
{
public static byte[] deriveKey(byte[] password, byte[] salt, int iterationCount, int dkLen)
throws java.security.NoSuchAlgorithmException, java.security.InvalidKeyException
{
SecretKeySpec keyspec = new SecretKeySpec(password, "HmacSHA1");
Mac prf = Mac.getInstance("HmacSHA1");
prf.init(keyspec);
// Note: hLen, dkLen, l, r, T, F, etc. are horrible names for
// variables and functions in this day and age, but they
// reflect the terse symbols used in RFC 2898 to describe
// the PBKDF2 algorithm, which improves validation of the
// code vs. the RFC.
//
// dklen is expressed in bytes. (16 for a 128-bit key)
int hLen = prf.getMacLength(); // 20 for SHA1
int l = Math.max(dkLen, hLen); // 1 for 128bit (16-byte) keys
int r = dkLen - (l-1)*hLen; // 16 for 128bit (16-byte) keys
byte T[] = new byte[l * hLen];
int ti_offset = 0;
for (int i = 1; i <= l; i++) {
F(T, ti_offset, prf, salt, iterationCount, i);
ti_offset += hLen;
}
if (r < hLen) {
// Incomplete last block
byte DK[] = new byte[dkLen];
System.arraycopy(T, 0, DK, 0, dkLen);
return DK;
}
return T;
}
private static void F(byte[] dest, int offset, Mac prf, byte[] S, int c, int blockIndex) {
final int hLen = prf.getMacLength();
byte U_r[] = new byte[ hLen ];
// U0 = S || INT (i);
byte U_i[] = new byte[S.length + 4];
System.arraycopy(S, 0, U_i, 0, S.length);
INT(U_i, S.length, blockIndex);
for(int i = 0; i < c; i++) {
U_i = prf.doFinal(U_i);
xor(U_r, U_i);
}
System.arraycopy(U_r, 0, dest, offset, hLen);
}
private static void xor(byte[] dest, byte[] src) {
for(int i = 0; i < dest.length; i++) {
dest[i] ^= src[i];
}
}
private static void INT(byte[] dest, int offset, int i) {
dest[offset + 0] = (byte) (i/(256 * 256 * 256));
dest[offset + 1] = (byte) (i/(256 * 256));
dest[offset + 2] = (byte) (i/(256));
dest[offset + 3] = (byte) (i);
}
// ctor
private PBKDF2() {}
}
क्या आप पासवर्ड/वाक्यांश हैशिंग, या डेटा एन्क्रिप्शन (जैसे पीजीपी या एसएसएल पासफ्रेज़ के साथ) करना चाहते हैं? शीर्षक पूर्व के लिए थोड़ा भ्रामक है, लेकिन मुझे लगता है कि आप बाद वाले करना चाहते हैं ... – JeeBee
मैं पूर्व करना चाहता हूं, लेकिन मुझे नहीं पता कि आप इसे क्यों बुझ रहे हैं। मैं इसे उलटा होना चाहता हूँ। पासफ्रेज़ के साथ डीईएस या एईएस एन्क्रिप्शन सोचें। सममित एन्क्रिप्शन, जैसा कि आप वर्णन कर रहे हैं assimetric नहीं। – skiphoppy
आपको पासफ्रेज़ रिवर्सिबल की एन्क्रिप्शन क्यों करने की आवश्यकता है? यह आमतौर पर वांछनीय नहीं है। – JeeBee