【问题标题】:What is the Kotlin equivalent of CC_SHA256 from Swift?Swift 的 CC_SHA256 的 Kotlin 等价物是什么?
【发布时间】:2019-12-26 04:16:00
【问题描述】:

我在 Swift 中有以下代码:

static func sha256(_ data: Data) -> Data? 
{
   guard let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) else { return nil }
   CC_SHA256((data as NSData).bytes, CC_LONG(data.count), res.mutableBytes.assumingMemoryBound(to: UInt8.self))
   return res as Data
}

在 Kotlin 中进行 Android 开发时,我不确定如何翻译 CC_SHA256_DIGEST_LENGTHCC_SHA256

这样做的正确方法是什么?

【问题讨论】:

  • 你看到Java了吗? stackoverflow.com/a/26361457/1820553
  • 不,我没有看到。谢谢。
  • 它只是二进制 SHA-256,没有任何编码/解码。有什么可看的?哦,还有一个保护声明,以防系统无法分配 32 个可变位(叹气)。
  • 啊,这么有用的评论。
  • 好吧,您可以查找如何在 Java 或 Kotlin 中执行 just SHA-256,对吗?创建算法,提供数据,获取输出。就是这样。

标签: android swift encryption kotlin sha256


【解决方案1】:

我能够完成我需要的:

import android.util.Base64
import com.google.common.hash.Hashing
import java.nio.charset.StandardCharsets

fun calculateSH256(secret: String): String {
   val sha256hex = Hashing.sha256()
       .hashString(secret, StandardCharsets.UTF_8)
       .asBytes()

   return Base64.encodeToString(sha256hex, Base64.DEFAULT)
}

这在 Gradle 文件中:

dependencies {
    implementation 'com.google.guava:guava:28.0-android'
}

【讨论】:

  • 你也可以添加一些测试用例吗?
  • @EthanAllen 如果您不想仅为 SHA-256 导入一个全新的库,您可以查看内置的 MessageDigest 类。您可以使用MessageDigest.getInstance("SHA-256") 获取一个实例,然后使用您的输入调用digest(如果很短,否则考虑将输入分块并通过update 提供摘要)
【解决方案2】:

一种更通用的方法(如 user2340612 所建议的):

private fun hashString(input: String, algorithm: String): String    {
    return MessageDigest.getInstance(algorithm)
        .digest(input.toByteArray())
        .fold("", { str, it -> str + "%02x".format(it) })
} 

List of valid algorithms

this guy致敬。

【讨论】:

    猜你喜欢
    • 2018-12-22
    • 2022-11-15
    • 2016-04-10
    • 1970-01-01
    • 2014-08-12
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多