如何在swift中将字符串(在Java中使用加密MessageDigest)编码为Base64字符串?

2024-05-02

在Java中,我使用了这个:

public void encryptData() {
    String data = "Hello World";
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    if (md == null) {
        return;
    }
    md.update(data.getBytes());
    String dataEncoded = Base64.encodeToString(md.digest(), 11);
    return dataEncoded; //print: sQqNsWTgdUEFt6mb5y4_5Q
}

我怎样才能在 Swift 中得到相同的结果?

Updated:

func test() -> Void {
    var data: String = "Hello World"
    data = md5(data)
    data = base64Encode(data)
    print("data = \(data)") //YjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTU= 
}

md5 和 base64Encode 函数使用自md5 here https://stackoverflow.com/questions/32163848/how-to-convert-string-to-md5-hash-using-ios-swift and 这里是base64 https://stackoverflow.com/questions/34406024/swift-base64-format

任何提示都会有帮助。


您的代码不会产生预期的结果,因为 引用的md5()函数将消息摘要返回为 十六进制编码的字符串,然后进行 Base64 编码。所以而不是

 String -> UTF-8 data -> MD5 digest -> Base64 encoding

你正在做

 String -> UTF-8 data -> MD5 digest -> hex encoding -> Base64 encoding

对函数的一个小修改返回消息摘要 作为数据:

func md5(string string: String) -> NSData {
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
    let data = string.dataUsingEncoding(NSUTF8StringEncoding)! // Conversion to UTF-8 cannot fail
    CC_MD5(data.bytes, CC_LONG(data.length), &digest)
    return NSData(bytes: digest, length: digest.count)
}

现在您可以计算 Base 64 编码的 MD5 摘要:

let string = "Hello World"

// Compute MD5 message digest:
let md5data = md5(string: string)
print("md5data = \(md5data)") // md5data = <b10a8db1 64e07541 05b7a99b e72e3fe5>

// Convert to Base 64 encoded string:
let base64 = md5data.base64EncodedStringWithOptions([])
print("base64 = \(base64)") // base64 = sQqNsWTgdUEFt6mb5y4/5Q==

This is almost你所期望的。 Java 代码显然会产生 所谓的“base64url”变体,没有填充 (比较https://en.wikipedia.org/wiki/Base64#Variants_summary_table https://en.wikipedia.org/wiki/Base64#Variants_summary_table).

因此我们必须修改两个字符并删除填充:

let base64url = base64
    .stringByReplacingOccurrencesOfString("+", withString: "-")
    .stringByReplacingOccurrencesOfString("/", withString: "_")
    .stringByReplacingOccurrencesOfString("=", withString: "")
print("base64url = \(base64url)") // base64url = sQqNsWTgdUEFt6mb5y4_5Q

现在的结果是sQqNsWTgdUEFt6mb5y4_5Q,并且与什么相同 你从Java代码中得到的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在swift中将字符串(在Java中使用加密MessageDigest)编码为Base64字符串? 的相关文章

随机推荐

  • 从heroku 中删除“server”和“via”标头?

    当我向本地服务器发送请求时 这是我的响应标头 Connection close Content Length 7 Content Type application json charset utf 8 Date Thu 27 Aug 201
  • 随机化节点顺序 xslt

    我有一个包含如下节点的 XML 文件
  • 调用 new SqlConnection() 会挂起程序

    这个把我难住了 我什至没有尝试连接到数据库 当这段代码到达我实例化一个新的 SqlConnection 对象的行时 它只是挂在那里 不会抛出异常或任何东西 我已经尝试将其编译为2 0 3 5和4 0 它们都挂了 当然 它也适用于我的机器和你
  • 为什么我的 git 预提交钩子不修剪行尾的空白?

    我在 Mac Mojave 上 我在 git templates hooks pre commit 创建了一个文件 我想删除我正在提交的文件行尾的空格 我希望这种情况在全球范围内发生在我的所有项目中 A git hook script to
  • 有没有办法为数据表绘制UMAP或t-SNE图?

    我有一个巨大的文件 下面是一小部分数据 如下所示 我想绘制一个 PCA 我可以使用 PCA 函数绘制 PCA 但它看起来有点乱 因为我有 200 列 所以我想也许 t SNE 或 UMAP 效果更好 但我无法使用它们进行绘图 我想在图中显示
  • Python GTK 信号处理程序不工作

    我正在使用 GTK 为 GUI 编写一个 Python 应用程序 我注意到从终端使用 Ctrl C 关闭它不起作用 我发现这是因为一个错误 所以我尝试手动处理该信号 问题是 如果我将默认行为设置为默认行为 则会捕获信号并正确关闭应用程序 但
  • 我如何从 Rust 的 Vec 中获取项目?

    我正在寻找一种方法consumes a Vec并返回一个元素 无需恢复的开销Vec的不变量的方式remove and swap remove do fn take
  • Gradle:根据配置文件加载属性文件

    我想编写一个 gradle 构建脚本 它可以在不同的环境 开发 实时 中工作 在每个环境中 我必须加载不同的属性集 目标目录 数据库等 是否有一种 gr adle 方法可以读取依赖于环境或配置文件的属性文件 您可能想查看Gradle 属性插
  • # 的未定义方法“type_cast”(NoMethodError)

    ActiveRecord ConnectionAdapters Column曾经有一个方法叫做type cast它接受一个字符串并将其转换为 到适当的实例 这似乎在某个时候被删除了 我不知道应该做什么来替换它 这是使用它的代码 Create
  • iOS 7 中强制横向 ViewController

    我有十多个处于纵向模式的 ViewController 但无论设备的方向如何 我都需要强制一个处于横向模式 这是解决方案 1 将 LandscapeViewController 嵌入到子类 NavigationController 中 并使
  • 枚举由 Autofac 生命周期跟踪的一次性物品

    Autofac 使用生命周期范围作为处理工作单元期间创建的所有组件的一种方式 虽然这是一个强大的功能 但很容易编写不能正确处理生命周期范围的代码 这会导致跟踪的一次性数量随着时间的推移而增长 实际上是内存泄漏 有没有办法监控生命周期范围在任
  • Maven pom.xml 中“SNAPSHOT”版本的含义[重复]

    这个问题在这里已经有答案了 在处理多个项目时 我遇到了很多版本号有问题的情况 快照后缀 例如
  • Sympy - 分数操作

    我基本上希望 Sympy 生成乳胶代码 frac x 1 3 y 但每当我要求它生成事物的 Tex 组件时 Sympy 总是返回 frac x 3 frac 1 3 如何避免分解方程 并将等于运算符分配给另一个变量 我还没有尝试将 y 部分
  • 发送短信之前显示确认对话框

    我是 Android 新手 我已经完全绑定了我的应用程序 但我希望现在对其进行更改 当有人发送短信时 我想显示一个发送短信的确认对话框 询问是否发送 我必须为此创建一个公共类 我已经编写了源代码 它工作正常 但如果用户不单击 是 或 取消
  • 共享扩展 - 自 iOS 14 以来首次尝试时应用程序未显示在共享菜单中

    升级到 Xcode 12 和 iOS 14 后 似乎开始发生一些奇怪的事情 应用程序以前在共享菜单选项中显示良好 但突然它表现得很奇怪 并且仅在第二次尝试后才显示 我的目标是获取网页网址 这是我的共享激活规则 我什至尝试过新项目 并添加了带
  • JS奇怪的行为[重复]

    这个问题在这里已经有答案了 有人可以帮助我 为什么我们在 JS 片段中有这种行为 var foo function return hi console log foo var foo1 function return hi console
  • 如何在没有android studio的情况下签署android apk

    我已经发现很多很多关于这一点的令人困惑的答案 How do I Sign release debug android app没有 Android Studio 例如 在签署 ionic cordova phonegap 应用程序时 您可以在
  • 如何在 React 中验证组件组合/“基础”组件/渲染的根组件?

    众所周知 当我们想要 扩展 一个
  • 在 R 中从一条线偏移绘制一条平行线

    我有代表沿着一些街道行驶的线串 但我实际上想代表骑自行车者的旅程 它偏离线路 即他们在路边附近行驶 我正在努力思考如何去做 我制作了一段可重现的 R 代码来进行说明 Let s say I have a route along some s
  • 如何在swift中将字符串(在Java中使用加密MessageDigest)编码为Base64字符串?

    在Java中 我使用了这个 public void encryptData String data Hello World MessageDigest md null try md MessageDigest getInstance MD5