جافا يعادل C#'Rfc2898DerivedBytes



java algorithm (3)

كنت أتساءل عما إذا كان أي شخص قد حاولت أن تفعل ما يعادل

Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(secret, saltValueBytes);
byte[] secretKey = key.GetBytes(16);

في جافا. حيث سر هو سلسلة (كلمة السر)، و سالتفالويبيتس هو، حسنا، الملح في صفيف بايت.

لقد حاولت الاشياء، ولكن لا يبدو أن التفاف رأسي حوله.


Answer #1

لقد وجدت هذا التنفيذ بواسطة بحث غوغل ولكني لم أستخدمه مطلقا.

A جافا الحرة تنفيذ رك 2898 / يسس # 5 PBKDF2

يبدو أنه لا يوجد تطبيق جافا صغير ومتاح مجانا ل رك 2898 / يسس # 5 متاح. صغيرة كما هو الحال في عدد قليل من الملفات المصدر، مع ترجمة تافهة وليس التبعيات، كما هو الحال في لغبل.

وبالنظر إلى توافر HMacSHA1 في موفر تشفير الشمس جس القياسية، مثل هذا التنفيذ هو بسيط جدا ويمكن أن تستمد من وصف رك حرفيا تماما. رمز بلدي هو تنفيذ غرفة نظيفة مع رك فقط كأساس لها.


Answer #2

تحسن قليلا كود تشيسو للعمل مع HMacSHA256 أو HMacSHA512 بإضافة ديريفكي مفرطة (). مع هذا التغيير، تم تشغيل التعليمات البرمجية مع PKDF2-هماك-SHA512 ناقلات اختبار من
فب كريبت ليب مما أدى إلى 6 فشل من أصل 100 حالات الاختبار.

// PBKDF2.java
// ------------------------------------------------------------------
//
// RFC2898 PBKDF2 in Java.  The RFC2898 defines a standard algorithm for
// deriving key bytes from a text password.  This is also called 
// "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. 
// 
// Author: Admin
// built on host: DINOCH-2
// Created Sun Aug 09 01:06:57 2009
//
// last saved: 
// Time-stamp: <2009-August-09 11:11:47>
// ------------------------------------------------------------------
//
// code from 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 NoSuchAlgorithmException,
            InvalidKeyException
    {
        return deriveKey("HmacSHA1", password, salt, iterationCount, dkLen);
    }

    public static byte[] deriveKey(String hmacAlgo,
                                   byte[] password,
                                   byte[] salt,
                                   int iterationCount,
                                   int dkLen)
            throws NoSuchAlgorithmException,
            InvalidKeyException
    {
        SecretKeySpec keyspec = new SecretKeySpec(password, hmacAlgo);
        Mac prf = Mac.getInstance(hmacAlgo);
        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, 32 for 256)

        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 () {}
}

Answer #3

وأنا أعلم أن هذا هو في وقت متأخر إلى اللعبة، ولكن جافا 6 وما فوق لديها المدمج في تنفيذ PBKDF2.

int dkLen = 64;
int rounds = 1000;
PBEKeySpec keySpec = new PBEKeySpec("Some password".toCharArray(), "SomeSalt".getBytes(), rounds, dkLen * 8);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] out = factory.generateSecret(keySpec).getEncoded();

قائمة جافا تحسينات الأمان 6 يدعي قابلية المقارنة مع يسس # 5، ومن خلال بلدي (السليم) اختبار يبدو أن تنتج مفاتيح PBKDF2 الصحيحة.





rfc2898