我正在将密码传递给 sha256。我成功创建了sha256,也可以打印出来。当我尝试将 digest.bytes 转换为字符串并附加它时,问题就开始了。
import 'package:crypto/crypto.dart';
var url = "http://example_api.php?";
url += '&hash=';
// hash the password
var bytes = utf8.encode(password);
var digest = sha256.convert(bytes);
print("Digest as hex string: $digest");
url += String.fromCharCodes(digest.bytes);
这是打印出来的:摘要为十六进制字符串:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4
这是附加到 url:¬gBóá\vá¥âUðg6#ȳ´Eùx×ÈFô
我做错了什么?我也试过 utf8.decode 方法,但使用它给我一个错误。
最佳答案
当你打印digest
时,print
方法会调用digest.toString()
,它被实现为返回摘要的字符串字节使用十六进制表示。如果您想要同样的东西,您有多种选择:
- 显式(或隐式)调用
digest.toString()
final digestHex = digest.toString(); // explicitly
final digestHex = '$digest'; // implicitly
- 将字节数组映射到它的十六进制等效值
final digestHex = digest.bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
- 使用convert包(这是加密包的作用)
import 'package:convert/convert.dart';
...
final digestHex = hex.encode(digest.bytes);
使用 utf8.decode
时出现错误的原因是您的摘要不是编码的 UTF-8 字符串,而是字节列表,对于所有意图和目的而言,这些字节列表都是完全随机的。您正在尝试将字节直接转换为字符串,如果您可以假设它们已经代表有效字符串,那么这样做会更容易。但是,对于哈希算法的字节输出,您不能安全地做出这样的假设。
但是,如果出于某种原因您仍想使用此选项,请使用 utf8.decode
的第二个可选参数来强制它尝试解码字节:
final digestString = utf8.decode(bytes, allowMalformed: true);
作为引用,[1, 255, 47, 143, 6, 80, 33, 202]
的字节列表导致“�/�P!�”,其中“�”表示无效/控制字符。您不想使用此选项,尤其是在字符串将成为 URL 的一部分的情况下(因为它几乎可以保证生成的字符串不是网络安全的)。
关于flutter - 如何将 sha256 的摘要添加到 flutter 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59725688/