【加班不再有】MD5

admin 2023年1月17日15:08:40评论12 views字数 7410阅读24分42秒阅读模式

【加班不再有】MD5

📌MD5已不再安全,涉及到有安全需求的业务,请慎重考虑使用MD5 !!!!

【加班不再有】MD5

愿大家加班不再有,在这里,整理一下常见语言调用MD5的方案,下文所有函数的入参均为字符串,出参均为HEX格式的字符串,由于个人水平有限,只能测试常见语言,其中有些语言我也并不熟悉,如果读者大佬们有更优雅或者更好的写法,欢迎与我交流,如果遇到这里面我没给写出来的,自己找下对应的实现吧,可以善于使用「搜索引擎」,搜索关键字如下:

How to get 「算法名称」 sum of a string using 「语言名称」?

比如,我要搜索Python的MD5的使用方法,搜索如下:

How to get MD5 sum of a string using python?

【加班不再有】MD5

大概率第一个找到的就是结果,如果不是就往下翻一翻,大概率是能找到调用方法的。

【加班不再有】MD5

Python

代码

import hashlib


def md5(message: str) -> str:
    return hashlib.md5(message.encode()).hexdigest()

使用案例

if __name__ == '__main__':
    print(md5('hello world'))
    print(md5('The quick brown fox jumps over the lazy dog'))
    print(md5(''))

Rust

依赖库

[dependencies]
md-5 = "0.10.4"

代码

use md5::{Md5, Digest};

fn str_md5(message: String) -> String {
    let mut hasher = Md5::new();
    hasher.update(message.as_bytes());
    let result = hasher.finalize();
    return format!("{:x}", result);
}

使用案例

fn main() {
    println!("{}", str_md5("Hello, world!".to_string()));
    println!("{}", str_md5("The quick brown fox jumps over the lazy dog".to_string()));
    println!("{}", str_md5("".to_string()));
}

Go

代码

import (
  "crypto/md5"
  "encoding/hex"
)

func GetMd5HashFromStr(message string) string {
  hash := md5.Sum([]byte(message))
  return hex.EncodeToString(hash[:])
}

使用样例

func main() {
  println(GetMd5HashFromStr("Hello World"))
  println(GetMd5HashFromStr("The quick brown fox jumps over the lazy dog"))
  println(GetMd5HashFromStr(""))
}

C

依赖库

这里采用Google修改后的boringssl,为啥不用openssl不解释,因为这里boringssl采用的是gtest, 这里面有些c的写法是受限的,因此这里我尽可能贴合gtest当中c++的规范,核心代码还是以C为主,不过我觉得能用c写这些的读者,应该不会来我这找写法了。

代码

#include <cstdio>
#include <cstring>
#include "openssl/md5.h"


static void md5(const char *message, char *output) {
  unsigned char digest[16];
  MD5_CTX ctx;
  MD5_Init(&ctx);
  MD5_Update(&ctx, message, strlen(message));
  MD5_Final(digest, &ctx);
  for (int i = 0; i < 16; i++) {
    sprintf(output + (i * 2), "%02x", (unsigned int)digest[i]);
  }
}

使用样例

int main(int argc, char **argv) {
  char output[33];
  const char *empty_message = "";
  md5(empty_message, output);
  printf("MD5("%s") = %s", empty_message, output);
  return 0;
}

C++

依赖库

  • botan

代码

#include <iostream>
#include "../lib/hash/hash.h"
#include "../lib/base/symkey.h"

std::string md5(const std::string &message) {
    auto hash = Botan::HashFunction::create("MD5");
    auto result = hash->process(message);
    return Botan::OctetString(result).to_string();
}

使用样例

int main(int argc, char *argv[]) {
    std::cout << md5("Hello, world!") << std::endl;
    std::cout << md5("The quick brown fox jumps over the lazy dog") << std::endl;
    std::cout << md5("") << std::endl;
    return 0;
}

Java

依赖库

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-crypto</artifactId>
            <version>5.3.8</version>
        </dependency>
    </dependencies>
</project>

代码

package com.littleq;

import cn.hutool.crypto.digest.MD5;

public class Main {
    static String md5(String message) {
        return MD5.create().digestHex(message);
    }
}

使用样例

package com.littleq;

public class Main {
    public static void main(String[] args) {
        System.out.println(md5("hello world"));
        System.out.println(md5("The quick brown fox jumps over the lazy dog"));
        System.out.println(md5(""));
    }
}

Kotlin

代码

import java.security.MessageDigest

fun md5(message: String): String {
    val md = MessageDigest.getInstance("MD5")
    val digest = md.digest(message.toByteArray())
    return digest.fold("") { str, it -> str + "%02x".format(it) }
}

使用样例

fun main(args: Array<String>) {
    println(md5("Hello, world!"))
    println(md5(""))
    println(md5("The quick brown fox jumps over the lazy dog"))
}

JavaScript

代码

const crypto = require('crypto');


function md5(message{
    return crypto.createHash('md5').update(message).digest('hex');
}

使用样例

function main({
    console.log(md5('Hello World!'));
    console.log(md5('The quick brown fox jumps over the lazy dog'));
    console.log(md5(''));
}

main();

C#

代码

using System.Security.Cryptography;
using System.Text;

string Md5(string message)
{
    StringBuilder stringBuilder = new StringBuilder();
    using (MD5 md5 = MD5.Create())
    {
        byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(message));
        foreach (byte b in bytes)
        {
            stringBuilder.Append(b.ToString("x2"));
        }
    }
    return stringBuilder.ToString();
}

使用样例

Console.WriteLine(Md5("Hello World!"));
Console.WriteLine(Md5("The quick brown fox jumps over the lazy dog"));
Console.WriteLine(Md5(""));

Dart

依赖

dependencies:
  # ...
  crypto: ^3.0.2
  # ...

代码

import 'dart:convert';

import 'package:crypto/crypto.dart';

String md5ToHex(String message) {
  return md5.convert(utf8.encode(message)).toString();
}

使用样例

void main(List<String> arguments) {
  print(md5ToHex(""));
  print(md5ToHex("Hello World!"));
  print(md5ToHex("The quick brown fox jumps over the lazy dog"));
}

Objective-C

代码

#import <CommonCrypto/CommonDigest.h>

NSString *md5(NSString *message) {
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5([message UTF8String], (CC_LONG) [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding], result);
NSMutableString *hash = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02X", result[i]];
}
return [hash lowercaseString];
}

使用样例

- (void)testExample {
NSLog(@"%s", md5(@"").UTF8String);
NSLog(@"%s", md5(@"Hello World!").UTF8String);
NSLog(@"%s", md5(@"The quick brown fox jumps over the lazy dog").UTF8String);
}

Swift

代码

import Foundation
import var CommonCrypto.CC_MD5_DIGEST_LENGTH
import func CommonCrypto.CC_MD5
import typealias CommonCrypto.CC_LONG

func MD5(message: String) -> String {
    let messageData = message.data(using: .utf8)!
    var digestData = Data(countInt(CC_MD5_DIGEST_LENGTH))
    _ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in
        messageData.withUnsafeBytes { messageBytes -> UInt8 in
            if let messageBytesBaseAddress = messageBytes.baseAddress, let digestBytesBlindMemory = digestBytes.bindMemory(to: UInt8.self).baseAddress {
                let messageLength = CC_LONG(messageData.count)
                CC_MD5(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
            }
            return 0
        }
    }
    return digestData.map {
                String(format: "%02hhx", $0)
            }
            .joined()
}

使用样例

import XCTest


final class cryptography_demoTestsXCTestCase {
    func testExample() throws {
        print(MD5(message: ""))
        print(MD5(message: "Hello, World!"))
        print(MD5(message: "The quick brown fox jumps over the lazy dog"))
    }
}

Ruby

代码

require "test_helper"
require 'digest'

class Cryptography::DemoTest < Minitest::Test
  def md5(message)
    Digest::MD5.hexdigest(message)
  end
end

使用样例

class Cryptography::DemoTest < Minitest::Test
  def test_it_does_something_useful
    print(md5(""))
    print(md5("Hello World"))
    print(md5("The quick brown fox jumps over the lazy dog"))
  end
end

Php

相对于PHP就很人性化,这个啥也不要,人家自带写好的函数,这里没有源码,直接看调用吧。

使用样例

<?php
echo md5("") . "n";
echo md5("Hello World!") . "n";
echo md5("The quick brown fox jumped over the lazy dog.") . "n";

结束语

没错,我又来开新的系列了,虽然之前的系列还都没写完,但是不影响我开新的系列,本系列文章会整理不同语言对于同一种密码学算法的调用方法,这里大多数是采用语言所内部提供的库为主,其他辅助的库为辅,这里建议大家使用标准实现,因为这些都是经过测试的,可以防止大多数常见的攻击方式,如非必要,不建议在生产环境自己写密码学算法的实现,目前所有代码的安全性由对应的编程语言的库函数保证,这边仅仅是简单的调用案例。


原文始发于微信公众号(Coder小Q):【加班不再有】MD5

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月17日15:08:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【加班不再有】MD5https://cn-sec.com/archives/1429007.html

发表评论

匿名网友 填写信息