使用 SHA-256 获得字符串后的错误结果 [重复]
Posted
技术标签:
【中文标题】使用 SHA-256 获得字符串后的错误结果 [重复]【英文标题】:Wrong result after hasing string with SHA-256 [duplicate] 【发布时间】:2018-03-11 07:57:39 【问题描述】:我正在尝试使用 SHA-256
对字符串进行哈希处理,但结果错误并且包含特殊字符。
代码:
String password = "test";
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] sha256Result = md.digest(password.getBytes(StandardCharsets.UTF_8));
String result = new String(sha256Result, StandardCharsets.UTF_8);
结果字符串:
��Ё�Le�/��Z���O+�,�]l��
【问题讨论】:
返回的数组是散列的原始字节,如果你想要它是十六进制的,你应该检查this question。 【参考方案1】:散列处理正确,但结果由字节数组组成。要使其可读,请使用StringBuffer
。作为转换示例,请查看example on Mkyong's webpage。
StringBuffer sb = new StringBuffer();
for (int i = 0; i < sha256Result.length; i++)
sb.append(Integer.toString((sha256Result[i] & 0xff) + 0x100, 16).substring(1));
【讨论】:
【参考方案2】:我认为你散列它的方式没问题。如果你想要它作为一个十六进制字符串之后:
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
String hex = (new HexBinaryAdapter()).marshal(md.digest(password.getBytes(StandardCharsets.UTF_8)));
【讨论】:
以上是关于使用 SHA-256 获得字符串后的错误结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Crypto++ 生成 SHA256 哈希,使用字符串作为输入和输出?