首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MalformatedInputException与Utility.convertByteArrayToCharArray和MessageDigest

MalformatedInputException与Utility.convertByteArrayToCharArray和MessageDigest
EN

Stack Overflow用户
提问于 2014-06-11 17:45:57
回答 1查看 23关注 0票数 0

我正在尝试创建一个glassfish自定义的JDBCRealm,在对它进行一些测试时,我在使用JDBCRealm函数时得到了一个MalformatedInputException。

因此,我决定将函数中抛出此错误的部分具体化,以测试它并了解它的起始位置。

恢复职能:

代码语言:javascript
复制
public void justATestFunction()
        throws Exception
{
    final char[] password = "myP4ssW0rd42".toCharArray();
    MessageDigest md = MessageDigest.getInstance("SHA-256");

    // according to the Utility doc, if the Charset parameter is null or empty,
    // it will call the Charset.defaultCharset() function to define the charset to use
    byte[] hashedPassword= Utility.convertCharArrayToByteArray(password, null);
    hashedPassword = md.digest(hashedPassword);
    Utility.convertByteArrayToCharArray(hashedPassword, null); // throw a MalformatedInputException
}

提前谢谢你的答复。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-11 18:12:43

让我们看看每一步:

代码语言:javascript
复制
byte[] hashedPassword= Utility.convertCharArrayToByteArray(password, null);

上面的Unicode-16字符使用默认的端编码(可能是WIN-1252或UTF-8 )将字节数组转换为字节数组。由于密码不包含标准7位ASCII以外的任何内容,因此无论编码结果都是相同的。

代码语言:javascript
复制
hashedPassword = md.digest(hashedPassword);

hashedPassword现在引用一个完全不同的字节数组,其中包含原始密码的二进制摘要。这是一个二进制字符串,不再代表任何字符编码。它是纯二进制数据。

代码语言:javascript
复制
Utility.convertByteArrayToCharArray(hashedPassword, null);

现在,您尝试“解码”二进制字符串,就好像它是用默认字符集编码的一样,这无疑会引发异常。

我怀疑您确实希望显示摘要的十六进制表示形式,或者显示基-64版本。在任何一种情况下,你所做的都是行不通的。

因为你还没有解释你想要实现什么,这是任何人都能做的最好的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24169325

复制
相关文章

相似问题

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