DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: ctccyy
今日帖子: 0
在线用户: 2
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 wuxi15 (似水·流年) ▲▲▲▲△ -
注册会员
2021/7/20 1:26:16
标题:
Delphi MD5 base64与Js的不一致 浏览:347
加入我的收藏
楼主: 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);
}
----------------------------------------------
-
作者:
男 wuxi15 (似水·流年) ▲▲▲▲△ -
注册会员
2021/7/20 1:27:14
1楼: 试过了很多方式,md5的结果是一致的,主要区别在base64
----------------------------------------------
-
作者:
男 kostyantynko (KostyantynX) ▲△△△△ -
注册会员
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.
----------------------------------------------
-
作者:
男 wuxi15 (似水·流年) ▲▲▲▲△ -
注册会员
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 的......
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲△△ -
注册会员
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!
作者:
男 emailx45 (emailx45) ▲▲▲△△ -
注册会员
2021/7/20 8:25:04
5楼: 按此在新窗口浏览图片
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
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/
作者:
男 emailx45 (emailx45) ▲▲▲△△ -
注册会员
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!
作者:
男 wg961423 (麦子仲肥) ★☆☆☆☆ -
盒子活跃会员
2021/7/20 9:10:21
6楼: 这么短的base64,明显不是String类型的MD5做的,应该是MD5后的二进制直接做的Base64,另外,MD5也会因字符串编码不同而不同
----------------------------------------------
-
作者:
男 wg961423 (麦子仲肥) ★☆☆☆☆ -
盒子活跃会员
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=
----------------------------------------------
-
作者:
男 briankuo (briankuo) ★☆☆☆☆ -
盒子活跃会员
2021/7/20 10:31:31
9楼: 不用看了,js那个是原始md5 hash(128位16字节)转base64,而不是md5 toString后(32个字节)再转base64,回答里面的都是md5ToString后再base64的
----------------------------------------------
-
作者:
男 wuxi15 (似水·流年) ▲▲▲▲△ -
注册会员
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);
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行425.7813毫秒 RSS