gpt4 book ai didi

java - 将 PHP 中的 SHA1 哈希值转换为 JAVA 代码

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:15 25 4
gpt4 key购买 nike

大家好,我有一个问题,我必须将 PHP 转换为 Java...

Php 函数以原始格式创建 sha1 哈希并对其进行编码。

strtolower(urlencode(sha1("asfasfasdf", true)));

输出:%bep%c3%9cc%dc%e4%89%f6n%0cw%fb%a3%95%ba%d8%c9r%82

在java中我尝试过:

public static String buildIdentity(String identity) {
try {
return URLEncoder.encode(toSHA1(identity.getBytes())).toLowerCase();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}

public static String toSHA1(byte[] convertme) throws UnsupportedEncodingException{
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-1");
md.update(convertme);
byte[] res = md.digest();
return new String(res);
}
catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}


System.out.println(Utils.buildIdentity("asfasfasdf"));

但其输出是:%ef%bf%bdp%c3%9cc%ef%bf%bd%ef%bf%bd%ef%bf%bdn%0cw%ef%bf%bd% ef%bf%bd%ef%bf%bdr%ef%bf%bd

请帮助我:(

找到解决方案!

public static String buildIdentity(String identity) {
try {
return URLEncoder.encode( new String(toSHA1(identity.getBytes("ISO-8859-1")), "ISO-8859-1"), "ISO-8859-1").toLowerCase();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}

public static byte[] toSHA1(byte[] convertme){
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(convertme);
return md.digest();
}
catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}

最佳答案

new String(byte[]) 使用平台默认编码将字节转换为字符。对我来说,如果您从 toSHA1 方法返回 new String(res, "iso-8859-1"); ,它就有效。这应该很好,因为“前 256 个代码点与 ISO-8859-1 的内容相同,以便轻松转换现有的西方文本。” (来自Wikipedia)。

但这涉及到与字符串之间不必要的转换。相反,我将使用 URLCodec来自 apache commons 的类或复制粘贴 this ,如果您不想添加依赖项。

默认编码问题也适用于 identity.getBytes() 调用:您应该在此处指定编码。它现在可能可以工作,但如果部署到生产服务器,它可能无法工作。

使用 URLCodec 修复代码:

public static String buildIdentity(String identity) {
try {
return new String(new URLCodec().encode(toSHA1(identity.getBytes("utf-8"))), "iso-8859-1");
} catch (UnsupportedEncodingException e) {
// should never happen, utf-8 and iso-8859-1 support is required by jvm specification. In any case, we rethrow.
throw new RuntimeException(e);
}
}

public static byte[] toSHA1(byte[] convertme) throws UnsupportedEncodingException {
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(convertme);
return md.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}

public static void main(String[] args) {
System.out.println(buildIdentity("asfasfasdf"));
}

关于java - 将 PHP 中的 SHA1 哈希值转换为 JAVA 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24259713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com