首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >相当于MD5CryptoServiceProvider computeHash & ToBase64String的Java

相当于MD5CryptoServiceProvider computeHash & ToBase64String的Java
EN

Stack Overflow用户
提问于 2014-08-22 13:48:07
回答 2查看 2.6K关注 0票数 1

我以以下方式计算MD5字符串的C#哈希:

代码语言:javascript
运行
复制
var provider = new System.Security.Cryptography.MD5CryptoServiceProvider();
var bytes= Encoding.Unicode.GetBytes(value);
bytes = provider.ComputeHash(bytes);
return Convert.ToBase64String(bytes);

我需要在Java (Android)中进行同样的计算,以匹配使用上述方法生成的散列。我在没有运气的情况下尝试了以下几种方法:

1.

代码语言:javascript
运行
复制
byte[] encoded = Base64.encodeBase64(str.getBytes());
return new String(encoded);

2.

代码语言:javascript
运行
复制
String digest = null;

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(message.getBytes("UTF-8"));

//converting byte array to Hexadecimal String
StringBuilder sb = new StringBuilder(2*hash.length);
for(byte b : hash){
    sb.append(String.format("%02x", b&0xff));
}

digest = sb.toString();

3.

代码语言:javascript
运行
复制
String resultHash = null;
    try {
        MessageDigest md5 = MessageDigest.getInstance("MD5");

        byte[] result = new byte[md5.getDigestLength()];
        md5.reset();
        md5.update(buffer);
        result = md5.digest();

        StringBuffer buf = new StringBuffer(result.length * 2);

        for (int i = 0; i < result.length; i++) {
            int intVal = result[i] & 0xff;
            if (intVal < 0x10) {
                buf.append("0");
            }
            buf.append(Integer.toHexString(intVal));
        }

        resultHash = buf.toString();
    } catch (NoSuchAlgorithmException e) {
    }
    return resultHash;

编辑:

生成C#匹配值的目标C方法如下:

代码语言:javascript
运行
复制
NSMutableString *encodedData = [NSMutableString string];

int i = 0, j = 0;

unsigned char char_array_3[3];

unsigned char char_array_4[5];



memset(char_array_3, 0, 3*sizeof(char));

memset(char_array_4, 0, 5*sizeof(char));



int length = [md5Data length];

char *bytes = (char*)[md5Data bytes];



while(length--) {

    char_array_3[i++] = *(bytes++);

    if (i == 3) {

        char_array_4[0] = kBase64Alphabet[(char_array_3[0] & 0xfc)>>2];

        char_array_4[1] = kBase64Alphabet[((char_array_3[0] &

                                            0x03) <<4) + ((char_array_3[1] & 0xf0) >>4)];

        char_array_4[2] = kBase64Alphabet[((char_array_3[1] &

                                            0x0f) <<2) + ((char_array_3[2] & 0xc0) >>6)];

        char_array_4[3] = kBase64Alphabet[char_array_3[2]&0x3f];



        [encodedData appendString:[NSString

                                   stringWithUTF8String:(const char*)char_array_4]];



        i = 0;

    }

}



if (i) {

    for(j=i; j<3; j++)

        char_array_3[j] = '\0';



    char_array_4[0] = kBase64Alphabet[(char_array_3[0] & 0xfc)>>2];

    char_array_4[1] = kBase64Alphabet[((char_array_3[0] & 0x03)

                                       <<4) + ((char_array_3[1] & 0xf0) >>4)];

    char_array_4[2] = kBase64Alphabet[((char_array_3[1] & 0x0f)

                                       <<2) + ((char_array_3[2] & 0xc0) >>6)];

    char_array_4[3] = kBase64Alphabet[char_array_3[2]&0x3f];



    char_array_4[i+1] = 0;

    [encodedData appendString:[NSString

                               stringWithUTF8String:(const char*)char_array_4]];



    while((i++<3))

        [encodedData appendString:[NSString stringWithUTF8String:"="]];

    }



    return encodedData;

}

示例

代码语言:javascript
运行
复制
 `wattlebird` in C# -> `ixfbWnWq9QmLecMFCzaZcw==`
 `wattlebird` in java -> `GTd5lE58tKIlpdmppEVurw==`
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-22 14:07:53

Base64 != 十六进制。您可以使用来自Base64apache共用-编解码器

代码语言:javascript
运行
复制
import org.apache.commons.codec.binary.Base64;

// ...

public static String hashValue(String value) {
    String digest = null;
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] hash = md.digest(value.getBytes("UTF-16LE")); // <-- note encoding
        return new String(Base64.encodeBase64(hash));
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return null;
}
票数 4
EN

Stack Overflow用户

发布于 2014-08-22 14:08:35

Base64不仅仅是十六进制中字节的值。(这是关于如何在Base64 RFC 4648中编码的RFC规范)

Android有一个类内建,可以使用Base64编码android.util.Base64

代码语言:javascript
运行
复制
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(message.getBytes("UTF-8"));

String base64 = Base64.encodeToString(hash, Base64.DEFAULT);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25448586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档