V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
U87
V2EX  ›  程序员

支付宝某个鉴权文档中,有段 Java 代码样例,本人 Python 写的比较多, Java 不太熟,想转成 Python 代码

  •  
  •   U87 · 2022-11-27 17:37:51 +08:00 · 2131 次点击
    这是一个创建于 726 天前的主题,其中的信息可能已经有所发展或是发生改变。

    接主题,java 代码如下:

    public String getCheckSum(String requestBody, String appSecret, String time) {

    String md5Digest = MessageDigestUtils.md5Digest(requestBody); 
    String checksum = MessageDigestUtils.sha1Digest(appSecret, md5Digest, time);
    
    return checksum;
    

    }

    public class MessageDigestUtils {

    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    
    private MessageDigestUtils() {
    }
    
    public static String md5Digest(String input) {
        StringBuilder hexValue = new StringBuilder();
    
        try {
    
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] md5Bytes = md5.digest(input.getBytes(StandardCharsets.UTF_8));
    
            for (byte md5Byte : md5Bytes) {
                int val = ((int) md5Byte) & 0xff;
                if (val < 16) {
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
        } catch (Exception e) {
            
        }
    
        return hexValue.toString();
    }
    
    public static String sha1Digest(String appSecret, String nonce, String time) {
        String content = appSecret + nonce + time;
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("sha1");
            messageDigest.update(content.getBytes());
            return getFormattedText(messageDigest.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    private static String getFormattedText(byte[] bytes) {
        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        for (int j = 0; j < len; j++) {
            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }
    

    }

    7 条回复    2022-11-28 22:27:02 +08:00
    wiix
        1
    wiix  
       2022-11-27 17:51:12 +08:00
    md5 和 sha1 总该认得吧?
    getFormattedText 将原始 md5/sha1 转成 16 进制文本。
    python 有自己的实现,用不着这些代码。
    yankebupt
        2
    yankebupt  
       2022-11-27 19:38:15 +08:00
    java 的库转完是个 byte[],得自己转字符串……
    你 python 随便找个直出字符串的 md5 sha1 库,就懒得转了......
    YepTen
        3
    YepTen  
       2022-11-28 08:40:00 +08:00
    你应该学点密码学的知识
    blueorange
        4
    blueorange  
       2022-11-28 09:14:10 +08:00
    hashlib.md5("123".encode()).hexdigest()
    blueorange
        5
    blueorange  
       2022-11-28 09:14:40 +08:00
    import hashlib
    hashlib.sha1("123".encode()).hexdigest()
    hashlib.md5("123".encode()).hexdigest()
    bjzhush
        6
    bjzhush  
       2022-11-28 11:20:15 +08:00   ❤️ 1
    这不就 md5 的 sha ,你用同样的输入交给这俩函数运行,看看 Python 的 md5 和 sha 的输出,对得上就验证成功了
    feitxue
        7
    feitxue  
       2022-11-28 22:27:02 +08:00
    想起了当时客户对接的银行给的示例,是命令行方式加密,当时是翻译成 java 代码来搞。
    嗯。怎么说呢,java 的 hutoo 真好用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   990 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 20:04 · PVG 04:04 · LAX 12:04 · JFK 15:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.