我们正在开发基于Java的应用程序并使用Hibernate for DAO。我在数据库中有一个XML数据存储作为Clob。使用Hibernate Clob对象并将其解析为String。然后我HASH(SHA-256)它。
Clob对象有2个方法。
getAsciiStream()
返回InputSteam
getCharacterStream()
返回Reader
解析器将InputStream
或Reader
解析为完全相同的String。然而,从它们中生成的哈希是不同的。为什么呢?
上下文:我们目前正在使用getAsciiStream()
,它限制了许多特殊字符。所以我们必须改变它getCharacterStream()
。但是,我们的应用程序(由于业务原因进行哈希比较)和客户将受到更改的影响。
Example XML:
<application>
<header>
<subtitle>WHAT EVER</subtitle>
<page_header>WHAT EVER</page_header>
</header>
<form>
<application_form_name>WHAT EVER</application_form_name>
<section>
<section_name>WHAT EVER</section_name>
<question>
<question_text>How is this applicant to something?</question_text>
<answer>WHAT EVER</answer>
</question>
<question>
<question_text>What is something?</question_text>
<answer>WHAT EVER</answer>
</question>
<question>
<question_text>Type of Customer</question_text>
<answer>Organization</answer>
</question>
<question>
<question_text>Full legal name of the applicant:</question_text>
<answer/>
</question>
<question>
<question_text>Legal Name</question_text>
<answer>WHAT EVER</answer>
</question>
<question>
<question_text>WHAT EVER</question_text>
<answer/>
</question>
<question>
<question_text>WHAT EVER</question_text>
<answer/>
</question>
<question>
<question_text>WHAT EVER</question_text>
<answer/>
</question>
<question>
<question_text>WHAT EVER</question_text>
<answer/>
</question>
</section>
</form>
</application>
答案 0 :(得分:0)
不推荐使用AFAIK getAsciiStream
另外,请提供两个(getAsciiStream / getCharacterStream)版本的哈希计算代码 - 整个部分 - 您如何从数据库中读取数据以及如何将数据提供给MessageDigest。它比您的XML示例提供更多信息。
顺便说一下。由于XML具有非重要的空格,其中特殊(非重要的空格忽略)方式如何计算XML数据上的消息摘要:
顺便说一下。你还是做错了。您只需使用实体就可以使用普通的latin1编码在XML中存储任何字符。因此,您可以按原样保留XML读取代码,但更改XML-to-String代码(为XmlWriter指定latin1编码)。