导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2021/7/20 1:26:16
标题:
Delphi MD5 base64与Js的不一致
浏览:1745
加入我的收藏
楼主:
md5+base64是最常见的加密式,我现在对一个字符时行MD5后再base64编码,得到的结果一直与用JS 生成的不一样。试过了很多方式了,了解的请指点一下。 js用的是https://github.com/emn178/js-md5 这个库 这个库对字符 Sa13432015321 得到的是qrH2CRGn6UMj6P8Qs0S0JQ== 对 1 ,得到的是 KMjt3j1hoEEVEdOxhm8GNg== function getPass(text){ var mdtext=md5(text); return md5.base64(mdtext); }
----------------------------------------------
-
作者:
2021/7/20 1:27:14
1楼:
试过了很多方式,md5的结果是一致的,主要区别在base64
----------------------------------------------
-
作者:
2021/7/20 2:47:28
2楼:
Rather use from RAD Studio sources "System.NetEncoding" and "System.Hash" unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Hash, System.NetEncoding, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text:=TNetEncoding.Base64.Encode(THashMD5.GetHashString('Test')); end; end.
----------------------------------------------
-
作者:
2021/7/20 4:01:40
3楼:
楼上的这个代码我是试过的,结果不一样的,这块代码的结果是 NDI3NGRjZGJjOTA3ZDIzODVhNGY5OWQ3MmVlMjc1NGQ= 而调用JS的结果是 qrH2CRGn6UMj6P8Qs0S0JQ==
----------------------------------------------
-
作者:
vga (vga)
★☆☆☆☆
-
盒子活跃会员
2021/7/20 7:58:53
4楼:
mysql : select to_base64(MD5('Sa13432015321')): NDI3NGRjZGJjOTA3ZDIzODVhNGY5OWQ3MmVlMjc1NGQ= select to_base64(MD5('1')): YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI= select to_base64(MD5('Test')): MGNiYzY2MTFmNTU0MGJkMDgwOWEzODhkYzk1YTYxNWI= 显然 ,你给出的 大帝 的结果是正确的,JS 的......
----------------------------------------------
-
作者:
2021/7/20 8:18:03
4楼:
Delphi 10.3.3 Arch ---> THashMD5.GetHashString() and TNetEncoding.Base64.Encode() -----> WORKING AS EXPECTED!!! 按预期工作! uses System.Hash, System.NetEncoding; procedure TForm1.BtnTextToMD5_HashClick(Sender: TObject); begin LbHashAsString.Caption := THashMD5.GetHashString(Trim(MemoTextToMD5Create.Text)); // calls "Reset" procedure and "Result := HashAsString" end; procedure TForm1.BtnMD5ResultedToBase64Click(Sender: TObject); begin MemoMD5TextToBase64.Text := TNetEncoding.Base64.Encode(Trim(LbHashAsString.Caption)); end; initialization ReportMemoryLeaksOnShutdown := true; finalization end.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2021/7/20 8:25:04
5楼:
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2021/7/20 8:55:26
6楼:
我试了下Oracle select MD5('Sa13432015321') from dual 得出的结果是:4274DCDBC907D2385A4F99D72EE2754D select utl_raw.cast_to_varchar2(utl_encode.base64_encode(MD5('Sa13432015321'))) from dual 得出的结果是:QnTc28kH0jhaT5nXLuJ1TQ== select utl_raw.cast_to_varchar2(utl_encode.base64_encode('4274DCDBC907D2385A4F99D72EE2754D')) from dual 得出的结果也是:QnTc28kH0jhaT5nXLuJ1TQ== MD5 Oracle 函数如下: CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2) RETURN VARCHAR2 IS retval varchar2(32); BEGIN retval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)) ; RETURN retval; end;
----------------------------------------------
-
作者:
hs_kill (lzl_17948876)
★☆☆☆☆
-
普通会员
2021/7/20 8:59:06
6楼:
看看结果长度也知道JS的不正常 默认MD5的结果是128bit(32位), 再用Base64编码 Base64编码后内容长度一般会比原始内容多出1/3的字节数 所以看看JS的结果qrH2CRGn6UMj6P8Qs0S0JQ== 这才24个字符 显然不正常 你看看是不是JS默认用MD5 16位的那种
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
2021/7/20 9:04:33
7楼:
https://www.browserling.com/tools/md5-hash ==> "Sa13432015321" MD5 = 4274dcdbc907d2385a4f99d72ee2754d Base64 = NDI3NGRjZGJjOTA3ZDIzODVhNGY5OWQ3MmVlMjc1NGQ= ---------- Text: "1" MD5 = c4ca4238a0b923820dcc509a6f75849b Base64 = YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI= ---------- Text: "Test" MD5 = 0cbc6611f5540bd0809a388dc95a615b Base64 = MGNiYzY2MTFmNTU0MGJkMDgwOWEzODhkYzk1YTYxNWI=
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2021/7/20 9:10:21
6楼:
这么短的base64,明显不是String类型的MD5做的,应该是MD5后的二进制直接做的Base64,另外,MD5也会因字符串编码不同而不同
----------------------------------------------
-
作者:
2021/7/20 9:57:32
8楼:
不知道Delphi怎么写,用CB写了个,js的不是md5,而是md5(md5()),另外因为是直接Base64的,所以并不是MD5的32位字符串,而是16个字节的二进制数据 UnicodeString S1,S=THashMD5::GetHashString(THashMD5::GetHashString(L"Sa13432015321")); TBytes Bytes; Bytes.Length=16; HexToBin(S.c_str(),0,Bytes,16,16); ShowMessage(TNetEncoding::Base64->EncodeBytesToString(&Bytes[0],Bytes.Length)); //qrH2CRGn6UMj6P8Qs0S0Jao=
----------------------------------------------
-
作者:
2021/7/20 10:31:31
9楼:
不用看了,js那个是原始md5 hash(128位16字节)转base64,而不是md5 toString后(32个字节)再转base64,回答里面的都是md5ToString后再base64的
----------------------------------------------
-
作者:
2021/7/20 15:31:53
10楼:
明白了,怪我JS学得不好,正如@wg961423 (麦子仲肥)说的,他是两次md5,第一次是取的String,第二次必须是Bytes,然后对这个Bytes进行Base64 Dlephi的代码如下 var s:String; Bytes:TBytes; begin s:='Sa13432015321'; var MD5:=THashMD5.GetHashString(s); var base64 :=TNetEncoding.Base64.EncodeBytesToString(THashMD5.GetHashBytes(md5)); ShowMessage(base64);
----------------------------------------------
-