首先需要知道的是使用Crypt加密数据时生成的密文并不是唯一值,同一数据多次执行encrypt()加密结果都不相同,且在不同Laravel项目中也无法解密同一个密文。例如在Laravel项目A中用encrypt()生成的密文无法在项目B中用decrypt()解密,会抛出DecryptException异常,异常描述是The MAC is invalid.这是因为在使用Crypt对数据进行加密,所有加密值都通过一个消息认证码(MAC)来检测对加密字符串的任何修改,不同app_key的项目之间无法使用decrypt()解密。这是一种比之前常用的md5加密和sha1加密要安全得多的一种加密方式。
知道了这一点,DecryptException的两种解决办法也显而易见:
- 在此项目中将数据再重新加密一次并保存到数据库。
- 将之前项目.env文件中APP_KEY的值替换当前项目的APP_KEY。