【加班不再有】SHA1
❝
📌SHA1已不再安全,涉及到有安全需求的业务,请慎重考虑使用SHA1 !!!!
❞
❝
📌这里给出常见语言的「SHA1」调用方案,目前已按照语言的「字母序」(正序)进行排列,方便读者查找。
❞
C
依赖库
-
boringssl
代码
#include <cstdio>
#include <cstring>
#include "openssl/sha.h"
static void sha1(const char *message, char *output) {
unsigned char digest[20];
SHA_CTX ctx;
SHA1_Init(&ctx);
SHA1_Update(&ctx, message, strlen(message));
SHA1_Final(digest, &ctx);
for (int i = 0; i < 20; i++) {
sprintf(output + (i * 2), "%02x", (unsigned int)digest[i]);
}
}
使用样例
int main(int argc, char **argv) {
char sha1_output[41];
sha1("", sha1_output);
printf("%sn", sha1_output);
sha1("Hello World!", sha1_output);
printf("%sn", sha1_output);
sha1("The quick brown fox jumps over the lazy dog.", sha1_output);
printf("%sn", sha1_output);
return 0;
}
C++
依赖库
-
botan
代码
#include <iostream>
#include "../lib/hash/hash.h"
#include "../lib/base/symkey.h"
std::string sha1(const std::string &message) {
auto hash = Botan::HashFunction::create("SHA1");
auto result = hash->process(message);
return Botan::OctetString(result).to_string();
}
使用样例
int main(int argc, char *argv[]) {
std::cout << sha1("") << std::endl;
std::cout << sha1("Hello, world!") << std::endl;
std::cout << sha1("The quick brown fox jumps over the lazy dog.") << std::endl;
return 0;
}
C#
代码
using System.Security.Cryptography;
using System.Text;
string Sha1(string message)
{
StringBuilder stringBuilder = new StringBuilder();
using (SHA1 sha1 = SHA1.Create())
{
byte[] bytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(message));
foreach (byte b in bytes)
{
stringBuilder.Append(b.ToString("x2"));
}
}
return stringBuilder.ToString();
}
使用样例
Console.WriteLine(Sha1("Hello World!"));
Console.WriteLine(Sha1("The quick brown fox jumps over the lazy dog"));
Console.WriteLine(Sha1(""));
Dart
依赖
dependencies:
# ...
crypto: ^3.0.2
# ...
代码
import 'dart:convert';
import 'package:crypto/crypto.dart';
String sha1ToHex(String message) {
return sha1.convert(utf8.encode(message)).toString();
}
使用样例
void main(List<String> arguments) {
print(sha1ToHex(""));
print(sha1ToHex("Hello World!"));
print(sha1ToHex("The quick brown fox jumps over the lazy dog."));
}
Go
代码
import (
"crypto/sha1"
"encoding/hex"
)
func SHA1(message string) string {
hash := sha1.Sum([]byte(message))
return hex.EncodeToString(hash[:])
}
使用样例
func main() {
println(SHA1(""))
println(SHA1("Hello World!"))
println(SHA1("The quick brown fox jumps over the lazy dog."))
}
Java
代码
package com.littleq;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Main {
public static String byteArrayToHex(byte[] a) {
StringBuilder sb = new StringBuilder(a.length * 2);
for (byte b : a)
sb.append(String.format("%02x", b));
return sb.toString();
}
static String sha1(String message) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA1");
return byteArrayToHex(md.digest(message.getBytes()));
}
}
使用样例
package com.littleq;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println(sha1(""));
System.out.println(sha1("Hello World!"));
System.out.println(sha1("The quick brown fox jumps over the lazy dog."));
}
}
JavaScript
代码
const crypto = require('crypto');
function sha1(message) {
return crypto.createHash('sha1').update(message).digest('hex');
}
使用样例
function main() {
console.log(sha1(''));
console.log(sha1('Hello World!'));
console.log(sha1('The quick brown fox jumps over the lazy dog.'));
}
main();
Kotlin
代码
import java.security.MessageDigest
fun sha1(message: String): String {
val md = MessageDigest.getInstance("SHA-1")
val digest = md.digest(message.toByteArray())
return digest.fold("") { str, it -> str + "%02x".format(it) }
}
使用样例
fun main(args: Array<String>) {
println(sha1(""))
println(sha1("Hello, world!"))
println(sha1("The quick brown fox jumps over the lazy dog."))
}
Objective-C
代码
#import <CommonCrypto/CommonDigest.h>
NSString *sha1(NSString *message) {
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1([message UTF8String], (CC_LONG) [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding], result);
NSMutableString *hash = [NSMutableString string];
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02X", result[i]];
}
return [hash lowercaseString];
}
使用样例
- (void)testExample {
NSLog(@"%s", sha1(@"").UTF8String);
NSLog(@"%s", sha1(@"Hello World!").UTF8String);
NSLog(@"%s", sha1(@"The quick brown fox jumps over the lazy dog.").UTF8String);
}
PHP
相对于PHP就很人性化,这个啥也不要,人家自带写好的函数,这里没有源码,直接看调用吧。
使用样例
<?php
echo sha1("") . "n";
echo sha1("Hello World!") . "n";
echo sha1("The quick brown fox jumps over the lazy dog.") . "n";
Python
代码
import hashlib
def sha1(message: str) -> str:
return hashlib.sha1(message.encode()).hexdigest()
使用案例
if __name__ == '__main__':
print(sha1('hello world'))
print(sha1('The quick brown fox jumps over the lazy dog'))
print(sha1(''))
R
依赖库
-
digest 0.6.30
代码
library(digest)
sha1 <- function(message) {
return(digest(message, algo = "sha1", serialize = FALSE))
}
使用案例
print(sha1(""))
print(sha1("Hello World!"))
print(sha1("The quick brown fox jumps over the lazy dog."))
Ruby
代码
require "test_helper"
require 'digest'
class Cryptography::DemoTest < Minitest::Test
def sha1(message)
Digest::SHA1.hexdigest(message)
end
end
使用样例
require "test_helper"
require 'digest'
class Cryptography::DemoTest < Minitest::Test
def test_it_does_something_useful
print(sha1("") + "n")
print(sha1("Hello World!") + "n")
print(sha1("The quick brown fox jumps over the lazy dog.") + "n")
end
end
Rust
依赖库
[dependencies]
sha-1 = "0.10.0"
代码
use sha1::{Sha1, Digest};
fn sha1(message: String) -> String {
let mut hasher = Sha1::new();
hasher.update(message.as_bytes());
let result = hasher.finalize();
return format!("{:x}", result);
}
使用案例
fn main() {
println!("{}", sha1("".to_string()));
println!("{}", sha1("Hello, world!".to_string()));
println!("{}", sha1("The quick brown fox jumps over the lazy dog.".to_string()));
}
Swift
代码
import Foundation
import var CommonCrypto.CC_SHA1_DIGEST_LENGTH
import func CommonCrypto.CC_SHA1
import typealias CommonCrypto.CC_LONG
func SHA1(message: String) -> String {
let messageData = message.data(using: .utf8)!
var digestData = Data(count: Int(CC_SHA1_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_SHA1(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
}
return 0
}
}
return digestData.map {
String(format: "%02hhx", $0)
}
.joined()
}
使用样例
final class cryptography_demoTests: XCTestCase {
func testExample() throws {
print(SHA1(message: ""))
print(SHA1(message: "Hello, World!"))
print(SHA1(message: "The quick brown fox jumps over the lazy dog."))
}
}
VB DotNet
代码
Imports System.Security.Cryptography
Imports System.Text
Public Class Application
Private Shared Function Sha1Hash(message As String) As String
Using hasher As SHA1 = SHA1.Create()
Dim bytes As Byte() =
hasher.ComputeHash(Encoding.UTF8.GetBytes(message))
Dim sBuilder As New StringBuilder()
For n As Integer = 0 To bytes.Length - 1
sBuilder.Append(bytes(n).ToString("x2"))
Next n
Return sBuilder.ToString()
End Using
End Function
End Class
使用样例
Imports System.Security.Cryptography
Imports System.Text
Public Class Application
Public Shared Sub Main()
System.Console.WriteLine(Sha1Hash(""))
System.Console.WriteLine(Sha1Hash("Hello World!"))
System.Console.WriteLine(Sha1Hash("The quick brown fox jumps over the lazy dog."))
End Sub
End Class
说明
❝
📌目前优先采用语言内部实现,引入的外部依赖会给出并指定版本,如果我对某些源码产生的修改,会优先遵从原始库的写法风格,并且会给出,由于个人水平有限,大家在使用我修改后或者实现的方案的时候,用于生产用途,建议自行研判一下安全性,建议大家使用标准实现,采用官方推荐或者使用人数较多的库用于生产环境,以保证安全性,因为个人水平有限,因此有些库可能用的不合适,如果读者觉得不合适,欢迎指出,如果读者有推荐使用的库,欢迎和我交流,注意,交流的时候建议提供完整的语言版本,库版本,以及使用方法和样例,最好是带文档,并且开源的库,并前期自行验证下实现是不是正确的,因为有些实现出来的算法用的标准不一样,可能会存在差异,如果有差异,最好可以提供对应的rfc或者paper,在这里先感谢各位读者大佬们了,最终愿大家加班不再有。
❞
原文始发于微信公众号(Coder小Q):【加班不再有】SHA1
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论