我可以向用户提供一个加密的字符串并确保它在 1-2 小时内是安全的吗
Can I provide an encrypted string to users and be sure it is safe for 1-2 hours
我们正在制作一款简单的游戏,
其中:
- 用户收到
next number of play
作为 encrypted string
在他们玩 之前
- 他们玩后,加密
password
提供给他们检查播放号码是否正确。
- 每个加密串是
only valid for 1-2 hours
播放次数,验证串和加密串在那个时间后重新生成
- 加密的字符串包含验证码(5 个字符),因此用户和我们都可以确保解密过程成功
要加密的示例字符(QQ9LU
是播放前提供给用户的随机验证码):
Next Play Number: 8 - Verify String: QQ9LU
示例加密字符串(播放前提供给用户):
NXRykKOv3B6kuu4Ke3svp7HH3enNiqIZrJSXJiF54QkHHjtXgqpUXxyuP7YUNICeFLg==
密码示例(播放后提供):
请注意这是为每次加密随机生成的
FA00RDjA77hlOzcOzH6kuGcc29CyM7Hw
我们使用 CodeIgniter 2.2.2 加密 Class 到 encrypt/decrypt 字符串
加密方法信息:
- 使用的函数:
$this->encrypt->encode($msg, $pass);
每次随机通过
- 密码是 CodeIgniter 2 默认值
MCRYPT_RIJNDAEL_256
- Mcrypt 模式是
MCRYPT_MODE_CBC
我的问题是:
我能相信用户无法在 1-2 小时内破解加密字符串(并且在获得密码之前知道播放次数)(除了运气)
随机验证码Verify String: T3YH4
放在那里好还是不好?是否影响安全? (这是为了验证解密结果是否成功,我们添加它是因为每个字符串中唯一的变量是单个数字,例如只有数字 8 变为 7,所以我们想在字符串中添加更多可变字符以可能有一个更好的安全性)
如有任何其他建议,我们将不胜感激
最好和最简单的方法是使用文件系统函数为非 public 路径中的每个用户创建一个简单的文本文件,其中包含两行,第一行是一个唯一的随机字符串 (长字符串长度不同),第二个是数字。
然后使用sha1_file
获取文件的哈希值,然后将其存储在与其路径和创建时间相关的数据库中,然后将此哈希值发送给用户。
用户玩完后,通过另一个从数据库中获取哈希值的脚本检查该值,然后读取文件并解析其第二行以显示数字。
通过这种方式,您为用户提供了一个不是字符串的哈希值,而是一个文件的哈希值,并且破解它以取回文件并不像在两个小时内完成那么简单。
简答:
- 从技术角度来看,您正在做的事情是不安全的,尽管它可能只需要 2 小时的时间框架就足够了。
- 您在此处尝试执行的操作称为 "message authentication",但不应该这样做,这反过来会影响安全性。您应该改用 HMAC。
我的建议是尽快升级到 CodeIgniter 3(CI2 将在几个月内停止接收甚至安全更新),并改用其新的加密库。这将使它安全多年,而不是几小时。
长答案:
加密库应该为你做加密和认证,但不幸的是CI_Encrypt
class本身写得不好并且缺少很多功能(例如身份验证),这就是它被弃用并被 CodeIgniter 3 中的新 (CI_Encryption
) 库取代的原因。
解释这里的所有缺陷将是一项艰巨的任务,所以我宁愿 link 你选择 external article (not self-promoting, don't worry),如果你对低端感兴趣,它会做得很好关卡详情。
但是,无论您使用哪个库,都必须注意一件事 - 密码与加密密钥不同。
密码具有不同的长度并且由人类使用,这意味着它们必须是人类可读的,这反过来又将它们限制为特定的一组字符。
另一方面,加密密钥具有固定长度(每个加密算法都设计为使用特定的密钥长度;对于 Rijndael-256,它是 32 个字节,您似乎匹配)并且不限于人类-可读字符(这意味着更多的熵,因此更安全) - 它们代表原始二进制数据。
任何其他事情都可以由图书馆控制(因此自动完成),但如果您传递的是密码而不是密钥 - 图书馆将使用密码,所以您应该注意这一点。
您正在向客户端提供 Encryption/Decryption 逻辑。黑客将轻松识别您的密码和加密字符串的匹配方式。
许多框架都有自己的密码创建和比较逻辑。 Yii 使用 SALT 和 SHA1 等其他功能...
保持简单,一切尽在掌握。生成您的加密内容并存储在您的末端。按照简单的步骤,
- 生成加密密码(使用SALTand/or其他加密工具)并保存在你这边
- 要求客户端(用户)输入密码(密钥)并获取服务器端
- 将您的密码(密钥)转换为加密密码并进行比较
CPasswordHelper 会对你有所帮助。尝试下载 Yii 源代码并为您展示它们的逻辑。
希望对您有所帮助!!
听起来是个有趣的游戏!
我假设您在文件系统的文件中创建这些字符串。如果您将它们托管在某些 Web 应用程序上,这些应用程序将采用不同的技术来断开字符串。
在字符串末尾添加代码称为对字符串加盐。虽然这会使字符串更难猜测,但如果您添加硬编码盐而不是随机生成的盐,它仍然可以通过蛮力方法轻松破解。
我会尝试使用单向哈希字符串作为密码并将其存储在数据库中。用户无法解密该字符串,只需提供匹配的密码即可访问您的字符串。程序有可能破坏单向散列字符串,但我发现如果他们在大学并且只有两个小时,那么他们不太可能足够聪明地做到这一点。开始生成单向哈希字符串以对其进行暴力破解需要大量领域知识和经验。
此外,您目前使用的方法可能是安全的,学生不太可能在 2 小时内破解字符串,除非他们熟悉需要一些工作才能找到的高级加密黑客脚本。我猜他们会反复试验,使用类似于您提供的示例的不同解密库,并希望他们能幸运地使用他们试图与您的匹配的字符串库。
此外,信息对于任何类型的加密都很重要。告诉别人您正在向您的字符串添加 5 代码盐,这将使他们对您的加密算法的工作原理有一些了解。然后他们可以根据您提供的信息尝试破解它的方法。用你自己的算法尝试同样的事情,让学生们蒙在鼓里,我怀疑有人会在规定的时间内破坏任何东西。许多黑客技术都涉及通过信息收集过程,黑客在尝试攻击系统之前先确定范围或映射系统。
我们正在制作一款简单的游戏, 其中:
- 用户收到
next number of play
作为encrypted string
在他们玩 之前 - 他们玩后,加密
password
提供给他们检查播放号码是否正确。 - 每个加密串是
only valid for 1-2 hours
播放次数,验证串和加密串在那个时间后重新生成 - 加密的字符串包含验证码(5 个字符),因此用户和我们都可以确保解密过程成功
要加密的示例字符(QQ9LU
是播放前提供给用户的随机验证码):
Next Play Number: 8 - Verify String: QQ9LU
示例加密字符串(播放前提供给用户):
NXRykKOv3B6kuu4Ke3svp7HH3enNiqIZrJSXJiF54QkHHjtXgqpUXxyuP7YUNICeFLg==
密码示例(播放后提供):
请注意这是为每次加密随机生成的
FA00RDjA77hlOzcOzH6kuGcc29CyM7Hw
我们使用 CodeIgniter 2.2.2 加密 Class 到 encrypt/decrypt 字符串
加密方法信息:
- 使用的函数:
$this->encrypt->encode($msg, $pass);
每次随机通过 - 密码是 CodeIgniter 2 默认值
MCRYPT_RIJNDAEL_256
- Mcrypt 模式是
MCRYPT_MODE_CBC
我的问题是:
我能相信用户无法在 1-2 小时内破解加密字符串(并且在获得密码之前知道播放次数)(除了运气)
随机验证码
Verify String: T3YH4
放在那里好还是不好?是否影响安全? (这是为了验证解密结果是否成功,我们添加它是因为每个字符串中唯一的变量是单个数字,例如只有数字 8 变为 7,所以我们想在字符串中添加更多可变字符以可能有一个更好的安全性)
如有任何其他建议,我们将不胜感激
最好和最简单的方法是使用文件系统函数为非 public 路径中的每个用户创建一个简单的文本文件,其中包含两行,第一行是一个唯一的随机字符串 (长字符串长度不同),第二个是数字。
然后使用sha1_file
获取文件的哈希值,然后将其存储在与其路径和创建时间相关的数据库中,然后将此哈希值发送给用户。
用户玩完后,通过另一个从数据库中获取哈希值的脚本检查该值,然后读取文件并解析其第二行以显示数字。
通过这种方式,您为用户提供了一个不是字符串的哈希值,而是一个文件的哈希值,并且破解它以取回文件并不像在两个小时内完成那么简单。
简答:
- 从技术角度来看,您正在做的事情是不安全的,尽管它可能只需要 2 小时的时间框架就足够了。
- 您在此处尝试执行的操作称为 "message authentication",但不应该这样做,这反过来会影响安全性。您应该改用 HMAC。
我的建议是尽快升级到 CodeIgniter 3(CI2 将在几个月内停止接收甚至安全更新),并改用其新的加密库。这将使它安全多年,而不是几小时。
长答案:
加密库应该为你做加密和认证,但不幸的是CI_Encrypt
class本身写得不好并且缺少很多功能(例如身份验证),这就是它被弃用并被 CodeIgniter 3 中的新 (CI_Encryption
) 库取代的原因。
解释这里的所有缺陷将是一项艰巨的任务,所以我宁愿 link 你选择 external article (not self-promoting, don't worry),如果你对低端感兴趣,它会做得很好关卡详情。
但是,无论您使用哪个库,都必须注意一件事 - 密码与加密密钥不同。
密码具有不同的长度并且由人类使用,这意味着它们必须是人类可读的,这反过来又将它们限制为特定的一组字符。
另一方面,加密密钥具有固定长度(每个加密算法都设计为使用特定的密钥长度;对于 Rijndael-256,它是 32 个字节,您似乎匹配)并且不限于人类-可读字符(这意味着更多的熵,因此更安全) - 它们代表原始二进制数据。
任何其他事情都可以由图书馆控制(因此自动完成),但如果您传递的是密码而不是密钥 - 图书馆将使用密码,所以您应该注意这一点。
您正在向客户端提供 Encryption/Decryption 逻辑。黑客将轻松识别您的密码和加密字符串的匹配方式。
许多框架都有自己的密码创建和比较逻辑。 Yii 使用 SALT 和 SHA1 等其他功能...
保持简单,一切尽在掌握。生成您的加密内容并存储在您的末端。按照简单的步骤,
- 生成加密密码(使用SALTand/or其他加密工具)并保存在你这边
- 要求客户端(用户)输入密码(密钥)并获取服务器端
- 将您的密码(密钥)转换为加密密码并进行比较
CPasswordHelper 会对你有所帮助。尝试下载 Yii 源代码并为您展示它们的逻辑。
希望对您有所帮助!!
听起来是个有趣的游戏! 我假设您在文件系统的文件中创建这些字符串。如果您将它们托管在某些 Web 应用程序上,这些应用程序将采用不同的技术来断开字符串。
在字符串末尾添加代码称为对字符串加盐。虽然这会使字符串更难猜测,但如果您添加硬编码盐而不是随机生成的盐,它仍然可以通过蛮力方法轻松破解。
我会尝试使用单向哈希字符串作为密码并将其存储在数据库中。用户无法解密该字符串,只需提供匹配的密码即可访问您的字符串。程序有可能破坏单向散列字符串,但我发现如果他们在大学并且只有两个小时,那么他们不太可能足够聪明地做到这一点。开始生成单向哈希字符串以对其进行暴力破解需要大量领域知识和经验。
此外,您目前使用的方法可能是安全的,学生不太可能在 2 小时内破解字符串,除非他们熟悉需要一些工作才能找到的高级加密黑客脚本。我猜他们会反复试验,使用类似于您提供的示例的不同解密库,并希望他们能幸运地使用他们试图与您的匹配的字符串库。
此外,信息对于任何类型的加密都很重要。告诉别人您正在向您的字符串添加 5 代码盐,这将使他们对您的加密算法的工作原理有一些了解。然后他们可以根据您提供的信息尝试破解它的方法。用你自己的算法尝试同样的事情,让学生们蒙在鼓里,我怀疑有人会在规定的时间内破坏任何东西。许多黑客技术都涉及通过信息收集过程,黑客在尝试攻击系统之前先确定范围或映射系统。