当前位置: 首页 > 面试题库 >

如何对JSON对象进行密码哈希处理?

施晗日
2023-03-14
问题内容

以下问题比最初看起来要复杂。

假设我有一个任意的JSON对象,其中可能包含任意数量的数据,包括其他嵌套的JSON对象。我想要的是JSON数据的加密哈希/摘要,而不考虑实际的JSON格式本身(例如:忽略换行符和JSON令牌之间的间距差异)。

最后一部分是要求,因为JSON将由许多不同平台上的各种(反)序列化器生成/读取。我知道至少有一个Java
JSON库,该库在反序列化期间读取数据时会完全删除格式。这样,它将破坏哈希。

上面的任意data子句也使事情变得复杂,因为它阻止了我以给定顺序获取已知字段并在拥有之前将它们连接起来(大致考虑Java的非加密hashCode()方法的工作原理)。

最后,也不希望将整个JSON字符串散列为字节块(反序列化之前),因为JSON中的某些字段在计算散列时应忽略。

我不确定是否有解决这个问题的好方法,但是我欢迎任何方法或想法=)


问题答案:

当为允许灵活性的任何数据格式计算散列时,该问题是一个常见问题。要解决此问题,您需要 规范化 表示形式。

例如,Twitter和其他服务用于身份验证的OAuth1.0a协议要求对请求消息进行安全哈希处理。为了计算哈希,OAuth1.0a说您需要首先按字母顺序排列字段,用换行符分隔它们,删除字段名(众所周知),并将空行用于空值。签名或哈希是根据该规范化的结果计算的。

XML DSIG以相同的方式工作-
在对XML进行签名之前,需要对其进行规范化。有一个提议的W3标准涵盖此内容,因为它是签名的基本要求。有人称它为c14n。

我不知道json的规范化标准。值得研究。

如果没有,您当然可以为您的特定应用程序使用建立约定。一个合理的开始可能是:

  • 按名称从大到小对属性进行排序
  • 所有名称上使用双引号
  • 在所有字符串值上使用双引号
  • 名称和冒号之间以及冒号和值之间没有空格或一个空格
  • 值和以下逗号之间没有空格
  • 所有其他空白都折叠为一个空格或一无所有-选择一个
  • 排除您不想签名的任何属性(一个示例是保存签名本身的属性)
  • 使用您选择的算法对结果进行签名

您可能还想考虑如何在JSON对象中传递该签名-可能建立一个众所周知的属性名称,例如“ nichols-
hmac”之类的名称,以获取哈希的base64编码版本。散列算法必须明确排除此属性。然后,JSON的任何接收者都可以检查哈希。

规范化表示不必是您在应用程序中传递的表示。只要给定任意JSON对象,就可以轻松生成它。



 类似资料:
  • 问题内容: 我时不时听到“使用bcrypt在PHP中使用密码,bcrypt规则存储密码”的建议。 但是什么呢?PHP不提供任何此类功能,维基百科对文件加密实用程序不屑一顾,而Web搜索仅显示了几种以不同语言实现的Blowfish实现。现在Blowfish也可以通过PHP在PHP中使用,但这对存储密码有何帮助?河豚是一种通用密码,它有两种工作方式。如果可以加密,则可以解密。密码需要单向散列功能。 有

  • 问题内容: 我一直在研究一些有关Java字符串加密技术的信息,但不幸的是,我还没有找到如何在Java中使用SHA-512对String进行哈希处理的很好的教程。我读了一些有关MD5和Base64的博客,但是它们并不像我想要的那样安全(实际上,Base64不是一种加密技术),所以我更喜欢SHA-512。 问题答案: 您可以将其用于SHA-512

  • 如果用户创建了一个新密码,并通过哈希算法存储在数据库中,则在用户登录时可以将其与用户输入的密码进行匹配。输入到登录屏幕的密码将被哈希化,然后检查它是否与存储的哈希匹配。如果是,则允许用户访问。 然而,如今,密码是经过哈希和盐处理的。因此,当用户第一次注册密码时,它会经过一个散列,然后会被加密10000次以上。这个salt与后端代码生成的关键字相同,还是每次salt都随机生成? 当用户输入密码登录时

  • 问题内容: 我正在开发一个Android应用程序,并且在发送到数据库之前有一些我想加密的字符串。我想要一个安全,易于实现的东西,每次传递相同的数据时都会生成相同的东西,并且无论传递给它的字符串有多大,最好都会使字符串保持恒定的长度。也许我正在寻找一个哈希。 问题答案: 此代码段为任何给定的字符串计算md5 资料来源:http : //www.androidsnippets.com/snippets

  • 我试图用MySQL中的一个数据库在Spring Web应用程序登录中训练哈希,但当我引入正确的密码时,登录名总是用?error=true再次发送我到登录名。 我确定,如果我把我在表'users'中的密码(即散列密码)准确地放入,我就可以正确地访问主页。由于项目的规范,所有的配置都是在XML文件中进行的。我是Spring的新手,我无法确定上下文文件中的错误在哪里。我使用两个身份验证提供者,但我只需要