Spr*_*owk 4 cryptography flutter
我正在将密码传递给 sha256。我成功创建了sha256并且也可以打印它。当我尝试将digest.bytes 转换为字符串并附加它时,问题就开始了。
\n\nimport \'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);\nRun 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当您 print 时digest,该print方法将调用digest.toString(),该方法的实现是使用十六进制表示形式返回摘要字节的字符串。如果您想要同样的东西,您有多种选择:
digest.toString()显式(或隐式)调用final digestHex = digest.toString(); // explicitly\nfinal digestHex = \'$digest\'; // implicitly\nRun Code Online (Sandbox Code Playgroud)\nfinal digestHex = digest.bytes.map((b) => b.toRadixString(16).padLeft(2, \'0\')).join();\nRun Code Online (Sandbox Code Playgroud)\nimport \'package:convert/convert.dart\';\n\n...\n\nfinal digestHex = hex.encode(digest.bytes);\nRun Code Online (Sandbox Code Playgroud)\n您使用时遇到错误的原因utf8.decode是您的摘要不是编码的 UTF-8 字符串,而是字节列表,其所有意图和目的都是完全随机的。您正在尝试直接将字节转换为字符串,如果您可以假设它们已经代表有效的字符串,那么这样做会更容易。但是,对于哈希算法的字节输出,您不能安全地做出这样的假设。
但是,如果由于某种原因您仍然想使用此选项,请使用第二个可选参数 forutf8.decode强制它尝试解码字节:
final digestString = utf8.decode(bytes, allowMalformed: true);\nRun 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 的一部分时(因为实际上可以保证生成的字符串不是网络安全的)。
| 归档时间: |
|
| 查看次数: |
5499 次 |
| 最近记录: |