كيف يمكنني إنشاء سلسلة هضم SHA512 في جافا باستخدام قلعة نطاط؟

StackOverflow https://stackoverflow.com/questions/2208374

سؤال

اختبار الوحدة هذا فشل:

    public void testDigest() throws NoSuchAlgorithmException {
    String hashExpected = "150a14ed5bea6cc731cf86c41566ac427a8db48ef1b9fd626664b3bfbb99071fa4c922f33dde38719b8c8354e2b7ab9d77e0e67fc12843920a712e73d558e197";
    MessageDigest md = new MessageDigest();
    String hashActual = new String(md.digest("hi"));
    Assert.assertEquals(hashExpected, hashActual);
}

فيما يلي تطبيقي من فئة Messagedigest:


import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

استيراد org.bouncycastle.crypto.digest؛ استيراد org.bouncycastle.crypto.digests.sha512digest؛ استيراد org.bouncycastle.crypto.io.digestInputstream؛ استيراد org.bouncycastle.jce.provider.bouncycastleprovider؛

الفئة العامة مساهمة {digest digest messagedigest؛

public MessageDigest() throws NoSuchAlgorithmException {
    Security.addProvider(new BouncyCastleProvider());
    messageDigest = new SHA512Digest();
}

public byte[] digest(String message) {
    byte[] retValue = new byte[messageDigest.getDigestSize()];
    messageDigest.update(message.getBytes(), 0, message.length());
    messageDigest.doFinal(retValue, 0);
    return retValue;
}

}

فشل الاختبار مع السبب التالي:


junit.framework.ComparisonFailure: expected:<150a14ed5bea6cc731cf86c41566ac427a8db48ef1b9fd626664b3bfbb99071fa4c922f33dde38719b8c8354e2b7ab9d77e0e67fc12843920a712e73d558e197> but was:<
í[êlÇ1φÄf¬Bz�´Žñ¹ýbfd³¿»™¤É"ó=Þ8q›ŒƒTâ·«�wàæÁ(C’
q.sÕXá

لدي شعور بأنني لا أستخدم مخطط الترميز الصحيح عند تحويل البايت [] Digest في سلسلة. سيكون موضع تقدير أي مساعدة.

هل كانت مفيدة؟

المحلول

القيمة التي تتوقعها هي قيمة ترميز عرافة. أنت تقوم بإنشاء سلسلة تعتمد على البايت الخام، والتي لن تعمل.

يجب عليك استخدام api java crypto القياسية كلما كان ذلك ممكنا بدلا من برامج برمجة التطبيقات المحددة Bouncycastle.

جرب ما يلي (تأتي مكتبة عرافة كودم العموم):

Security.addProvider(new BouncyCastleProvider());

String data = "hello world";

MessageDigest mda = MessageDigest.getInstance("SHA-512", "BC");
byte [] digesta = mda.digest(data.getBytes());

MessageDigest mdb = MessageDigest.getInstance("SHA-512", "BC");
byte [] digestb = mdb.digest(data.getBytes());

System.out.println(MessageDigest.isEqual(digesta, digestb));

System.out.println(Hex.encodeHex(digesta));

نصائح أخرى

مجرد إضافة إلى إجابة Kevin: منذ Java 5، يمكنك استخدامها String.format("%0128x", new BigInteger(1, digesta)) بدلا من Commons-Codec لتنسيق صفيف البايت كرقم مشفر بنسبة 128 رقما مع الأصفار الرائدة.

نعم، تحتاج إلى تحويل صفيف البايت الخاص بك إلى سلسلة عرافة. :-) تفحص ترميز المشاع أباتشي, ، وخاصة عرافة صف دراسي.

منذ bouncycastle 1.49 هناك حفنة toHexString طريقة في Hex صف دراسي. علي سبيل المثال:

Hex.toHexString(digest);

سوف تعيد لك هش هضم كجافا String في شكل سداسي عشري.

للرجوع اليها Bouncycastle Javadoc. أو grepcode..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top