如何将 sha256 的摘要添加到 flutter 中的字符串中?

Spr*_*owk 4 cryptography flutter

我正在将密码传递给 sha256。我成功创建了sha256并且也可以打印它。当我尝试将digest.bytes 转换为字符串并附加它时,问题就开始了。

\n\n
import \'package:crypto/crypto.dart\';\n\nvar url = "http://example_api.php?";\nurl += \'&hash=\';\n\n// hash the password\nvar bytes = utf8.encode(password);\nvar digest = sha256.convert(bytes);\nprint("Digest as hex string: $digest");\n\nurl += String.fromCharCodes(digest.bytes);\n
Run Code Online (Sandbox Code Playgroud)\n\n

打印为:摘要为十六进制字符串:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4

\n\n

这附加到网址:\xc2\xacgB\xc3\xb3\xc3\xa1\\v\xc3\xa1\xc2\xa5\xc3\xa2U\xc3\xb0g6#\xc3\x88\xc2\xb3\xc2\xb4E \xc3\xb9x\xc3\x97\xc3\x88F\xc3\xb4

\n\n

我究竟做错了什么?我还尝试了 utf8.decode 方法,但使用它给了我一个错误。

\n

Abi*_*n47 5

当您 print 时digest,该print方法将调用digest.toString(),该方法的实现是使用十六进制表示形式返回摘要字节的字符串。如果您想要同样的东西,您有多种选择:

\n
    \n
  • digest.toString()显式(或隐式)调用
  • \n
\n
final digestHex = digest.toString(); // explicitly\nfinal digestHex = \'$digest\';         // implicitly\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 将字节数组映射到其等效的十六进制数
  • \n
\n
final digestHex = digest.bytes.map((b) => b.toRadixString(16).padLeft(2, \'0\')).join();\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 使用转换包(这就是加密包的作用)
  • \n
\n
import \'package:convert/convert.dart\';\n\n...\n\nfinal digestHex = hex.encode(digest.bytes);\n
Run Code Online (Sandbox Code Playgroud)\n
\n

您使用时遇到错误的原因utf8.decode是您的摘要不是编码的 UTF-8 字符串,而是字节列表,其所有意图和目的都是完全随机的。您正在尝试直接将字节转换为字符串,如果您可以假设它们已经代表有效的字符串,那么这样做会更容易。但是,对于哈希算法的字节输出,您不能安全地做出这样的假设。

\n

但是,如果由于某种原因您仍然想使用此选项,请使用第二个可选参数 forutf8.decode强制它尝试解码字节:

\n
final digestString = utf8.decode(bytes, allowMalformed: true);\n
Run Code Online (Sandbox Code Playgroud)\n

[1, 255, 47, 143, 6, 80, 33, 202]作为参考, “\xef\xbf\xbd/\xef\xbf\xbdP!\xef\xbf\xbd”中的结果字节列表,其中“\xef\xbf\xbd”表示无效/控制字符。您不想使用此选项,尤其是当字符串将成为 URL 的一部分时(因为实际上可以保证生成的字符串不是网络安全的)。

\n