【发布时间】:2013-08-09 08:57:33
【问题描述】:
我有一个存储我所有用户信息(用户名、密码等)的 mysql 数据库。我正在构建一个带有 back-sql 的 LDAP 服务器,除了密码字段外,一切正常。所有密码都是基本的 MD5 哈希,所以
select MD5('testPass01')
返回
428a65ed9de7dbf8ef7d08f884528440
显然这是二进制值的十六进制表示。 LDAP 会理解类似这样的 base64 编码字符串
{MD5}Qopl7Z3n2/jvfQj4hFKEQA==
我找到了一个执行转换的 perl 脚本
#!/usr/bin/perl
use MIME::Base64;
use strict;
my @md5 = split "",$ARGV[0];
my @res;
for (my $i = 0 ; $i < 32 ; $i+=2)
{
my $c = (((hex $md5[$i]) << 4) % 255) | (hex $md5[$i+1]);
$res[$i/2] = chr $c;
print $c;
}
print "{MD5}".encode_base64(join "", @res);
#-------------------------------------------#
我的问题是:是否可以通过存储过程使用 SQL 进行转换?我无法安装包含 base64 编码和解码功能的 MySQL 服务器 5.6
谢谢
【问题讨论】:
-
上一篇文章包含一个 BASE64_ENCODE 函数 - stackoverflow.com/questions/358500/base64-encode-in-mysql
-
我正在使用它,但据我了解,在我在帖子中的 perl 脚本的第 7 行,我需要获取每个字符的十六进制值并按 4 移位,然后将其与它旁边的字符的十六进制值。然后将其转换为 CHAR。一旦完成,我就可以使用 BASE64_ENCODE
-
好的,我发现如果您使用
select BASE64_ENCODE(unhex(md5('foobar')),则使用引用的函数。但是这个功能有问题。如果您的密码有特定的字母组合,则结果是少一个字母...